PHP uyumsuz Web Hizmetleri

8 Cevap php

Nasıl PHP SOAP uzantısı kullanarak bir web hizmeti için bir zaman uyumsuz çağrı yapabilirim?

8 Cevap

My immediate answer should be: You can't.
PHP does not have threading abilities that can be used in "userland".

Eğer gerçekten bunu istiyorsanız Şimdi, bunu etrafında gidebilirsiniz bazı yolları vardır:

  1. Arka planda, başka bir işlem spawn ve veritabanı / dosya sistemi ya da her neyse aracılığıyla izlemek için exec fonksiyonlarını kullanın.
  2. Başka bir işlem spawn ve veritabanı / dosya sistemi ya da her neyse aracılığıyla izlemek için çatal işlevini kullanın.

Bu 2 yaklaşımların aksiliklere bunu uyumsuz yapabilirsiniz ama bir geri istiyorsanız o zaman çok zor ve hiç de önemsiz olacak. Peki, bu uyumsuz çağrı yapar senaryo üzerinde bunun için beklemek mümkün olmayabilir olacak beri, hatta olacak bir geri çağırma olacak değildir. Bu, sadece izleme düzeni çeşit olabileceği anlamına gelir. AJAX öneririm.

Eğer kıvırmak kullanırsanız, 'çoklu' birden fazla sunucuya paralel aramalara izin çağıran bir dizi var ...

Bu yardımcı olabilir, (paralel uzak yordam çağrıları): http://en.dklab.ru/lib/Dklab_SoapClient/

Eğer Linux komut satırı php arama yapmak için yeteneği varsa, bir pnctl_fork komutunu çalıştırmak ve çatallı alt sürecin web hizmetini diyebiliriz.

Onun doğru cevap olarak Gustavo aşağı modded neden bilmiyorum.

Ben rehber API google PHP ile yazılmış bir kabuk komut dosyasını çalıştırmak için exec kullanın. Bu gibi komut dosyasını başlatmak:

run.php param1 = 1 param2 = 2 &> ajax.txt

run son satırı

'bitti' echo

Bu işlemi bittikten bulana kadar sonra benim ajax yoklama 'ajax.txt' devam ediyor.

Hacky, ama basit (KISS)

monk.e.boy

Sen istemci bağlantısı kesildi sonra işleme devam eder bir SoapServer sınıf yazmak gerekir. This article size bir başlangıç ​​noktası verecektir, ama bir SoapServer sınıf içinde yukarı benzer bir şey sarmak olacak.

Kabaca bu gibi bakmak için gidiyor (not: Ben SoapServer Bu içini test ettik, ama bu size bir fikir verir)

class NonBlockingSoapServer extends SoapServer
{
    public function handle()
    {
        // this script can run forever
        set_time_limit(0);

        // tell the client the request has finished processing
        header('Location: index.php');  // redirect (optional)
        header('Status: 200');          // status code
        header('Connection: close');    // disconnect

        // clear ob stack 
        @ob_end_clean();

        // continue processing once client disconnects
        ignore_user_abort();

        ob_start();
        /* ------------------------------------------*/
        /* this is where regular request code goes.. */
        $result = parent::handle();
        /* end where regular request code runs..     */
        /* ------------------------------------------*/
        $iSize = ob_get_length();
        header("Content-Length: $iSize");

        // if the session needs to be closed, persist it
        // before closing the connection to avoid race
        // conditions in the case of a redirect above
        session_write_close();

        // send the response payload to the client
        @ob_end_flush();
        flush();

        /* ------------------------------------------*/
        /* code here runs after the client diconnect */
        /* YOUR ASYNC CODE HERE ......               */

        return $result;
    }
}

Tek yönlü SoapClient sınıfını genişleten ve kendi __doRequest uygulayarak, Curl en "çok" paketi tarafından sağlanan select() ing yöntemi kullanmaktır.

Bulduğum küçük, çalışan örnek indirebilirsiniz https://github.com/halonsecurity/sp-enduser/blob/master/inc/soap.php ve benzeri kullanılır

$client1 = new SoapClientAsync('some-systems-wsdl', $options);
$client2 = new SoapClientAsync('another-systems-wsdl', $options);
$client1->someFunction($arguments);
$client2->anotherFunction($arguments);
soap_dispatch();
$result1 = $client1->someFunction($arguments);
$result2 = $client1->anotherFunction($arguments);

Burada tarif edildiği gibi http://www.halon.se/blogs/making-phps-soap-client-asynchronous/

AJAX tipi aramayı kullanarak clientside yerine sunucu tarafı yok.