PHP: посетите асинхронный URL-адрес и получите ответ без блокировки

В настоящее время я использую exec / wget для обратного вызова URL-адреса без блокировки PHP-скрипта:

$newURL = /* URL we need to callback */
$newURL = escapeshellarg($newURL);
exec("curl -k $newURL > /dev/null &");

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

Как я могу этого добиться?


person apscience    schedule 05.07.2013    source источник
comment
file_get_contents($newURL); не соответствует вашей цели?   -  person vladkras    schedule 05.07.2013
comment
@vladkras file_get_contents блокируется.   -  person Wayne Whitty    schedule 05.07.2013
comment
Вы можете использовать cURL multi (все равно, вероятно, не сработает в вашем сценарии), но это не то, как PHP катится. Вы должны просто сделать cronjob регулярно посещать ваш URL и не заботиться о времени, которое потребуется для запуска.   -  person CodeAngry    schedule 05.07.2013
comment
мой совет - использовать для этого JS, если это возможно   -  person vladkras    schedule 05.07.2013
comment
[_1 _] [1] может быть здесь полезен, если вы используете php-fpm. [1]: stackoverflow.com/a/4236290/89771   -  person Alix Axel    schedule 05.07.2013


Ответы (1)


В этом сообщении есть решение для отправки запросов aysnc с помощью с использованием разветвленных запросов curl:

private function request($url, $payload) {

  $cmd = "curl -X POST -H 'Content-Type: application/json'";
  $cmd.= " -d '" . $payload . "' " . "'" . $url . "'";

  if (!$this->debug()) {
    $cmd .= " > /dev/null 2>&1 &";
  }

  exec($cmd, $output, $exit);
  return $exit == 0;
}

У него также есть решение, в котором вы пишете в сокет перед его немедленным закрытием (до того, как получите ответ):

private function request($body) {

    $protocol = "ssl";
    $host = "api.segment.io";
    $port = 443;
    $path = "/v1/" . $body;
    $timeout = $this->options['timeout'];

    try {
      # Open our socket to the API Server.
      $socket = fsockopen($protocol . "://" . $host, $port,
                          $errno, $errstr, $timeout);

      # Create the request body, and make the request.
      $req = $this->create_body($host, $path, $content);
      fwrite($socket, $req);
      # ...
    } catch (Exception $e) {
      # ...
    }
}
person Wayne Whitty    schedule 05.07.2013
comment
Но мне нужен ответ. - person apscience; 06.07.2013