Nasıl PHP SOAP uzantısı kullanarak bir web hizmeti için bir zaman uyumsuz çağrı yapabilirim?
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:
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.
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/