PHP Async Web Services - PullRequest
       19

PHP Async Web Services

4 голосов
/ 24 сентября 2008

Как сделать асинхронный вызов веб-службы, используя PHP SOAP Extension?

Ответы [ 9 ]

4 голосов
/ 24 сентября 2008

Мой немедленный ответ должен быть: Вы не можете.
PHP не имеет потоковых возможностей, которые можно использовать в «пользовательском пространстве».

Теперь, если вы действительно хотите это сделать, есть несколько способов обойти это:

  1. Используйте функции exec для запуска другого процесса в фоновом режиме и отслеживания его через базу данных / файловую систему или что-либо еще.
  2. Используйте функцию fork, чтобы порождать другой процесс и отслеживать его через базу данных / файловую систему или что-то еще.

Недостатки этих двух подходов в том, что вы можете сделать это асинхронным, но если вам нужен обратный вызов, то это будет очень сложно и совсем не тривиально. Ну, это даже не будет обратный вызов, так как вы не сможете ждать его в сценарии, который выполняет асинхронный вызов. Это означает, что у вас может быть только какая-то схема мониторинга. Я бы предложил AJAX.

1 голос
/ 28 ноября 2013

Одним из способов является использование метода select() ing, предоставляемого «multi» пакетом CURL, путем расширения класса SoapClient и реализации собственного __doRequest.

Самый маленький рабочий пример, который я нашел, может быть загружен https://github.com/halonsecurity/sp-enduser/blob/master/inc/soap.php и используется как

$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);

как описано здесь http://www.halon.se/blogs/making-phps-soap-client-asynchronous/

1 голос
/ 03 октября 2013

Вам нужно написать класс SoapServer, который продолжит обработку после отключения клиента. Эта статья даст вам отправную точку, но вам придется обернуть нечто подобное внутри класса SoapServer.

Это будет выглядеть примерно так (примечание: я не проверял это внутри SoapServer, но это дает вам представление)

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;
    }
}
1 голос
/ 10 января 2011

Может помочь, (параллельные удаленные вызовы процедур): http://en.dklab.ru/lib/Dklab_SoapClient/

1 голос
/ 12 августа 2009

Если вы используете curl, у него есть набор 'multi' вызовов, чтобы разрешить параллельные вызовы на несколько серверов ...

0 голосов
/ 02 октября 2008

Я не знаю, почему Густаво был урезан, поскольку его правильный ответ.

Я использую exec для запуска сценария оболочки, написанного на PHP, который связывается с Google API. Я запускаю сценарий так:

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

последняя строка запуска -

эхо 'закончено'

тогда мой ajax продолжает опрашивать 'ajax.txt', пока не обнаружит, что процесс завершен.

Хаки, но простой (KISS)

monk.e.boy

0 голосов
/ 25 сентября 2008

Попробуйте метод, который они дали мне в моем вопросе: Асинхронные вызовы PHP?

0 голосов
/ 25 сентября 2008

Делайте это на стороне клиента, а не на стороне сервера, используя вызов типа AJAX.

0 голосов
/ 24 сентября 2008

Если у вас есть возможность сделать вызов php из командной строки в Linux, вы можете выполнить команду pnctl_fork и вызвать веб-службу из разветвленного дочернего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...