2016-01-13 11 views
1

На самом деле у меня есть функция proc_open, которая будет выполнять команду и передать ее подкоманды. Здесь есть проблема, которая будет происходить иногда и не обычно.PHP - Подождите определенное время для выполнения одной строки, в противном случае возврат

Проблема

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

Вопрос

Я хочу сказать, что ждать ответа в течение 20 секунд, и если вы не получите никакого ответа. возврат из функция. Это важно, что я не хочу останавливать выполнение сценария, но просто возвращаюсь из функции.
Должен ли я использовать многопоточные библиотеки как POSIX?

Есть ли способ реализовать эту идею?
Любая идея будет оценена по достоинству. Заранее спасибо

Пример кода

<?PHP 
set_time_limit(0); 

..... 

public function test() 
{ 
    foreach ($this->commands as $cmd) 
    { 
     fwrite($pipes[0], "$cmd \n"); 

     //Sometimes PHP stuck on the following line 
     //Wait for almost 20 sec if respond did not came return 
     $read = fread($pipes[1], 2096) . "\n"; 
    } 
} 
+0

Возможно, это может вам помочь: http://stackoverflow.com/questions/7749869/how-can-i-set-time-out-for-fread-when-access-socket – nikoskip

ответ

0

Вы не сказали, что это ОС работает на, хотя вы упоминаете POSIX. Ни то, что SAPI. В совокупности они оказывают большое влияние на ваши варианты.

Кроме того, вы не сказали, в каком процессе вы начали, и как его следует лечить, когда он истекает. Закрытие потоков stdio может привести к сбою процесса. Если вы хотите отправить сигнал, вам нужно знать pid (IIRC не доступен из proc_open()).

Непосредственная проблема у вас есть то, что поток, по умолчанию блокировки чтения, поэтому просто установив его на неблокируемый получает мимо первое препятствие:

set_stream_blocking($pipes[1],false); 
... 

fwrite($pipes[0], "$cmd \n"); 
$ttl=time()+20; 
while(''==$read && time()<$ttl) { 
    $read=fread($pipes[1],2096); 
    if (!$read) sleep(1); 
} 
if (!$read) echo " timeout"; 

(КСТАТИ это, вероятно, не будет работать на MSWindows)

+0

Я работаю над телеграммой- cli в Ubuntu. соединяющий несколько команд с процессом, и он будет выполнять их один за другим. но когда я использую ваш метод, все испортилось, и порядок выполнения и результат изменились !!!! –

0

Использование stream_set_timeout (но после FWRITE, если же поток):

fwrite($pipes[0], "$cmd \n"); 
stream_set_timeout($pipes[1], 20); 
$read = fread($pipes[1], 2096) . "\n"; 

Редактировать: В некоторых особых случаях вы должны использовать stream_select() вместо этого, делать ошибки в PHP.

$r = [$pipes[0]]; 
$w = $e = null; 
if(stream_select($r, $w, $e, 20) !== false) 
    foreach($r as $s) 
    $read = fread($s,2096); 

Надеюсь, это поможет?

+0

Спасибо за ответ, но не было изменений в функционировании –

+0

Как это не сработало? –

+0

Как и прежде, программа ждет ответа, и ответ не наступит, но программа ждет и ждет ... –

 Смежные вопросы

  • Нет связанных вопросов^_^