fsockopen & Закрыть соединение в PHP, но продолжать выполнять скрипт - PullRequest
1 голос
/ 06 апреля 2011

У меня есть PHP-скрипт, которому нужно закрыть соединение после возврата данных, но продолжить выполнение:

<?php
  // Some code

  ob_start();

  echo $data;

  header("Content-type: application/soap+xml;charset=UTF-8\r\n");
  header("Content-Length: " . ob_get_length() . "\r\n");
  header("Content-Encoding: none\r\n");
  header("Connection: close\r\n\r\n");

  // Print buffer
  ob_end_flush();
  ob_flush();
  flush();

  // Close connection

  // Some code, continue executing
?>

Это работает с некоторыми клиентами, но мне иногда нужно вызывать другой PHP-скрипт

<?php
    // Some code

    $connection = @fsockopen($url['host'], $url['port'], $errno, $errstr);

    if (!$connection) { 
      throw new Exception('');
    }

    fputs($connection, "POST {$url['path']} HTTP/1.1\r\n");
    fputs($connection, "Host: {$url['host']}\r\n");
    fputs($connection, "Content-type: text/xml;charset=UTF-8\r\n");
    fputs($connection, "SOAPAction: \"{$soapaction}\"\r\n");
    fputs($connection, "Content-Length: " . strlen($request) . "\r\n");
    fputs($connection, "Content-Encoding: none\r\n");
    fputs($connection, "Connection: close\r\n\r\n");
    fputs($connection, $request);

    $respponse = '';
    while(!feof($connection)) {
      // receive the results of the request
      $response .= fgets($connection, 512);
    }

    // some code
?>

Проблема в том, что fsockopen не закрывает соединение при получении данных, только когда заканчиваются все первые сценарии.

Единственная идея, которая у меня есть, это проверить длину и закрыть руководство, когдаданные получены.

1 Ответ

0 голосов
/ 07 мая 2011

Ваш первый (серверный) скрипт будет держать сокет открытым до его завершения. Сокеты находятся на более низком уровне, чем HTTP, и когда вы отправляете Connection: close header, второй (клиентский) скрипт должен обрабатывать его сам, а не функцию fsockopen.

То, что вы делаете (считая количество байтов в ответе), является правильным способом решения этой проблемы.

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