Avatar billede oxen Nybegynder
12. december 2008 - 14:36 Der er 11 kommentarer

PHP Script til SMS Gateway

Jeg har side hvor sitet skal sende en sms ud til medlemmer en gang imellem.
At hente mobilnr. osv. fra mysql ikke problemet, men det at
lave et script som bruger xml og SOAP ud fra nedestående pdf. er for stor mundfuld for mig :-( 
http://www.yourhost.dk/Support/Guides/Documentation/YourhostSmsGatewayDocumentation.pdf

Er der en venlig(klog) sjæl der kan hjælpe mig ?

Oxen
Avatar billede repox Seniormester
15. december 2008 - 14:26 #1
Jeg ved ikke om det her kan bruges men jeg udviklede det fordi jeg ikke lige havde SOAP på min server og brugte istedet det her:
xmlrpc.obj.php:
<?php

    class XMLRPCClient
    {

        var $connection = false;
        var $host = false;
        var $action = false;
        var $xml_to_send =false;
        var $path;

        public function __construct($host, $path = "", $port = 80)
        {
            if(!$this->connection = fsockopen($host, $port, $errno, $errstr, 30))
            {
                throw new Exception("<b>XMLRPCCLient - Could not open host</b>:<br />Error no is <b>".$errnr."</b><br />Error message is <b>".$errstr."</b>");
                return false;
            }
            if(strpos($path, "/") === 0)
                $path = substr($path, 1);

            $this->host = $host;
            $this->path = $path;

        }


        public function setData($xml)
        {
            $this->xml_to_send = $xml;
        }
       
        public function setAction($action)
        {
            $this->action = $action;
        }


        public function exec()
        {

            if($this->_validate())
                return $this->_sendXML();
            else
                return false;

        }

        private function _sendXML()
        {

            $data = $this->_createSendString();

            $response = "";

            fwrite($this->connection, $data);
            while (!feof($this->connection)) {
                $response .= fgets($this->connection, 128);
            }

            if(($start = strripos($response, "<?xml")) !== false)
            {
                $response = substr($response, $start);
            }
            else
            {
                $response = "<b>Response was not XML</b>";
            }

            return $response;



        }

        private function _createSendString()
        {


            $content_length = strlen($this->xml_to_send);

            $data = "POST /".$this->path." HTTP/1.0\n";
            $data .= "User-Agent: xmlrpc-epi-php/0.2 (PHP)\n";
            $data .= "Host: ".$this->host."\n";
            $data .= "Content-Type: text/xml; charset=utf-8\n";
            $data .= "Content-Length: ".$content_length."\n";
           
            if($this->action !== false)
                $data .= "SOAPAction: \"".$this->action."\"\n";
           
            $data .= "Connection: close\n\n";
            $data .= $this->xml_to_send;
           
            return $data;
           
        }

        private function _validate()
        {
            if(!$this->connection)
            {
                throw new Exception("<b>XMLRPCCLient:</b> Connection has not been established");
                return false;
            }

            if(!$this->xml_to_send)
            {
                throw new Exception("<b>XMLRPCCLient:</b> XML to send has not been set");
                return false;
            }

            return true;


        }



        public function __destruct()
        {
            fclose($this->connection);
        }

    }
?>

Og så bruger jeg den således:
<?php

include("xmlrpc.obj.php");

// Tilret selv relevante data
$xml = "
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">
  <soap:Body>
    <SendSMS xmlns=\"http://service.yourhost.dk/smsgateway/\">
      <username>string</username>
      <password>string</password>
      <phoneNo>string</phoneNo>
      <message>string</message>
      <flashSMS>false</flashSMS>
    </SendSMS>
  </soap:Body>
</soap:Envelope>
";

    try
    {
        $client = new XMLRPCClient("service.yourhost.dk", "smsgateway/Default.asmx");
        $client->setAction("http://service.yourhost.dk/smsgateway/SendSMS");
        $client->setData(trim($xml));
        echo $client->exec(); //obj::exec() returnerer svaret fra servicen
    }
    catch (Exception $e)
    {
        echo $e;
    }

?>

Scriptet er gammelt, men virker da stadigvæk (hurtigt testet) men der er sikkert en pænere måde at gøre det på end det jeg har skrevet...
Avatar billede oxen Nybegynder
15. december 2008 - 15:34 #2
Tak RePox..

jeg får en fejl i linie 23 som er : try 
 
Parse error: syntax error, unexpected '{' in H:\2263497654\root\rebox.php on line 23
 

Oxen
Avatar billede repox Seniormester
15. december 2008 - 17:13 #3
Prøv lige at vise hele indholdet af rebox.php?
Avatar billede oxen Nybegynder
15. december 2008 - 18:23 #4
<?php

include("xmlrpc.obj.php");
$num = "+4599999999" ;
$besked = "test" ;
$flashSMS = "false";

// Tilret selv relevante data
$xml = "
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">
  <soap:Body>
    <SendSMS xmlns=\"http://service.yourhost.dk/smsgateway/\">
    <username>xxxxx</username>
      <password>xxxxxxx</password>
      <phoneNo>'.$num.'</phoneNo>
      <message>'.$besked.'</message>
      <flashSMS>'.$flashSMS.'</flashSMS>
    </SendSMS>
  </soap:Body>
</soap:Envelope>
";

    try
    {
        $client = new XMLRPCClient("service.yourhost.dk", "smsgateway/default.asmx");
        $client->setAction("http://service.yourhost.dk/smsgateway/SendSMS");
        $client->setData(trim($xml));
        echo $client->exec(); //obj::exec() returnerer svaret fra servicen
    }
    catch (Exception $e)
                  {
                    echo $e;
                  }

?>
Avatar billede repox Seniormester
15. december 2008 - 18:43 #5
Hmm.... Sidder du måske på en PHP4 server? Anyways, en direkte kopiering viser ikke umiddelbart nogen fejl...
Men du har en fejl i din XML.
Du escaper dig ud af en dobbeltquotet streng  med '.$flashSMS.'
du skal bruge ".$flashSMS." istedet.
Avatar billede oxen Nybegynder
15. december 2008 - 19:55 #6
phpinfo http://www.ndehk.dk/info.php

Det lader til at det forstås af serveren... kunne det gøres anderledes ?

try
    {
        $client = new XMLRPCClient("service.yourhost.dk", "smsgateway/default.asmx");
        $client->setAction("http://service.yourhost.dk/smsgateway/SendSMS");
        $client->setData(trim($xml));
        echo $client->exec(); //obj::exec() returnerer svaret fra servicen
    }
    catch (Exception $e)
                  {
                    echo $e;
                  }
Avatar billede oxen Nybegynder
15. december 2008 - 20:00 #7
Det lader til at det IKKE forstås af serveren... kunne det gøres anderledes ?
Avatar billede repox Seniormester
15. december 2008 - 21:59 #8
Jamen, en hurtig omskrivning til PHP4:
<?php

    class XMLRPCClient
    {

        var $connection = false;
        var $host = false;
        var $action = false;
        var $xml_to_send =false;
        var $path;

        function XMLRPCClient($host, $path = "", $port = 80)
        {
            if(!$this->connection = fsockopen($host, $port, $errno, $errstr, 30))
            {
                echo("<b>XMLRPCCLient - Could not open host</b>:<br />Error no is <b>".$errnr."</b><br />Error message is <b>".$errstr."</b>");
                return false;
            }
            if(strpos($path, "/") === 0)
                $path = substr($path, 1);

            $this->host = $host;
            $this->path = $path;

        }


        function setData($xml)
        {
            $this->xml_to_send = $xml;
        }
     
        function setAction($action)
        {
            $this->action = $action;
        }


        function exec()
        {

            if($this->_validate())
                return $this->_sendXML();
            else
                return false;

        }

        function _sendXML()
        {

            $data = $this->_createSendString();

            $response = "";

            fwrite($this->connection, $data);
            while (!feof($this->connection)) {
                $response .= fgets($this->connection, 128);
            }
           
            fclose($this->connection);

            if(($start = strripos($response, "<?xml")) !== false)
            {
                $response = substr($response, $start);
            }
            else
            {
                $response = "<b>Response was not XML</b>";
            }


            return $response;



        }

        function _createSendString()
        {


            $content_length = strlen($this->xml_to_send);

            $data = "POST /".$this->path." HTTP/1.0\n";
            $data .= "User-Agent: xmlrpc-epi-php/0.2 (PHP)\n";
            $data .= "Host: ".$this->host."\n";
            $data .= "Content-Type: text/xml; charset=utf-8\n";
            $data .= "Content-Length: ".$content_length."\n";
         
            if($this->action !== false)
                $data .= "SOAPAction: \"".$this->action."\"\n";
         
            $data .= "Connection: close\n\n";
            $data .= $this->xml_to_send;
         
            return $data;
         
        }

        function _validate()
        {
            if(!$this->connection)
            {
                echo("<b>XMLRPCCLient:</b> Connection has not been established");
                return false;
            }

            if(!$this->xml_to_send)
            {
                echo("<b>XMLRPCCLient:</b> XML to send has not been set");
                return false;
            }

            return true;


        }

    }
?>

Og så gør således istedet try { } delen:
    $client = new XMLRPCClient("service.yourhost.dk", "smsgateway/default.asmx");
    $client->setAction("http://service.yourhost.dk/smsgateway/SendSMS");
    $client->setData(trim($xml));
    echo $client->exec(); //obj::exec() returnerer svaret fra servicen
Avatar billede oxen Nybegynder
16. december 2008 - 18:33 #9
GREAT det funker :-)

men.. Prøvet at hente 10 menlemmers tlf nummer og får flg. error:
Fatal error: Maximum execution time of 30 seconds exceeded in H:\2263497654\root\xmlrpc.obj.php on line 59.

Den løber tør for tid !?  Hvad er hentningfra mysql uhensigtsmæssig siden det tager så langt tid at komme gennem xmlrpc.obj.php ?

Her er linierne på rebox.php




<?php


include("xmlrpc.obj.php");

$besked = "test" ;
$flashSMS = "false";

$db=mysql_connect("mysq501.yourhost.dk","xxxxx","xxxxx");
mysql_select_db("xxxxxo",$db);
$foresp=mysql_query("SELECT * FROM test Where mobil = 'xxxxx' ORDER BY navn");
while($data = mysql_fetch_array($foresp)){

$num = "+45".$data[2] ;
echo $num."<BR>" ;

// Tilret selv relevante data
$xml = "
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">
  <soap:Body>
    <SendSMS xmlns=\"http://service.yourhost.dk/smsgateway/\">
    <username>xxxxx</username>
      <password>xxxxx</password>
      <phoneNo>".$num."</phoneNo>
      <message>".$besked."</message>
      <flashSMS>".$flashSMS."</flashSMS>
    </SendSMS>
  </soap:Body>
</soap:Envelope>
";

  $client = new XMLRPCClient("service.yourhost.dk", "smsgateway/default.asmx");
    $client->setAction("http://service.yourhost.dk/smsgateway/SendSMS");
    $client->setData(trim($xml));
    echo $client->exec(); //obj::exec() returnerer svaret fra servicen
 
}
?>
Avatar billede oxen Nybegynder
16. december 2008 - 20:43 #10
testet 10 gange ..

5-7 smser bliver sendt...

har indsat
set_time_limit(0);
hviket løser problemet med
Fatal error: Maximum execution time of 30 seconds exceeded

men det er vel den rigtige måde at løse problemet på ?
Jeg mener, yourhosts sms gateway bliver vel "overophedet",
hvis jeg skyder 300 smser af ?
Avatar billede repox Seniormester
17. december 2008 - 09:44 #11
Altså, umiddelbart er jeg ikke imponeret over den service, hvis den fungerer som du beskriver.
Men nej, den rigtige løsning er ikke at bruge set_time_limit(0);
Den rigtige løsning ville være at bruge et cronjob til at klare de udsendelser, så de ikke er afhængige af klienten.
Men du bør overveje at benytte dig af en anden udbyder (hvis det da er meningen det skal bruges til noget seriøst), her kan jeg varmt anbefale unwire.dk - det bruger vi her i firmaet og er meget tilfredse med den service vi får.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester