Не видя сценария, очень сложно дать вам окончательный ответ, однако вам нужно убедиться, что ваш сценарий ожидает данных соответствующим образом.Совершенно определенно , а не следует делать, это вызывать stream_set_timeout($fp, 0);
или stream_set_blocking($fp, 0);
в указателе вашего файла.
Базовая структура скрипта, выполняющая что-то подобное, которое должно избегать гонок, будетчто-то вроде этого:
// Open the file pointer and set blocking mode
$fp = fopen('http://www.domain.tld/somepage.file','r');
stream_set_timeout($fp, 1);
stream_set_blocking($fp, 1);
while (!feof($fp)) { // This should loop until the server closes the connection
// This line should be pretty much the first line in the loop
// It will try and fetch a line from $fp, and block for 1 second
// or until one is available. This should help avoid racing
// You can also use fread() in the same way if necessary
if (($str = fgets($fp)) === FALSE) continue;
// rest of app logic goes here
}
Вы также можете использовать sleep()
/ usleep()
, чтобы избежать гонок, но лучший подход - полагаться на вызов функции блокировки для выполнения вашей блокировки.Если это работает в одной ОС, но не в другой, попробуйте явно установить режимы / поведение блокировки, как указано выше.
Если вы не можете заставить это работать с вызовом fopen()
, передающим URL-адрес HTTP,это может быть проблема с реализацией оболочки HTTP в PHP.Чтобы обойти это, вы можете использовать fsockopen()
и обрабатывать запрос самостоятельно.Это не так уж сложно, особенно если вам нужно только отправить один запрос и прочитать постоянный ответ потока.