вызов php system () и запись в именованный канал без блокировки - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть код php:

<?
$cmd="mkfifo /tmp/myfifo;";
system($cmd);
$cmd="echo 1 > /tmp/myfifo 2>&1 &";
system($cmd);
?>

на сервере apache. Я хочу, чтобы вторая команда не блокировала. По данным информационной страницы системы:

If a program is started with this function, in order for it to continue running 
in the background, the output of the program must be redirected to a file or 
another output stream. Failing to do so will cause PHP to hang until the execution 
of the program ends.

Но я не понимаю, как применить это к этой ситуации. Я пытался

$cmd="echo 1 > /tmp/myfifo > /dev/null 2>&1 &";

Но, честно говоря, это кажется бессмысленным.

РЕДАКТИРОВАТЬ:

Моя конечная цель - записать в fifo, который никогда не будет считан, и установить время ожидания записи через 5 секунд. Итак, если мне удастся заставить эту команду не блокировать выполнение php, я могу спать 5 секунд, а затем cat / tmp / myfifo> / dev / null 2> & 1, чтобы разблокировать исходную запись.

Может кто-нибудь придумать лучший способ, чтобы моя запись не зависала бесконечно (ни на заднем плане, ни на переднем плане)?

Ответы [ 3 ]

2 голосов
/ 20 ноября 2012

Если среда, созданная system(), - это bash 4.x или более поздняя версия, я думаю, вы могли бы использовать «coproc» для предотвращения ее блокировки?Это работает для меня в сценариях оболочки.(Или, если он не выполняется в bash напрямую, вы можете вызвать его "bash -c ...")

1 голос
/ 08 февраля 2012

Если вам нужно записать в файл (и запретить запись другим процессам до тех пор, пока вы не закончите), просто используйте file_put_contents .

<?php
// The new person to add to the file
$person = "John Smith\n";

// Write the contents to the file, 
// using the FILE_APPEND flag to append the content to the end of the file
// and the LOCK_EX flag to prevent anyone else writing to the file at the same time
file_put_contents('/tmp/myfifo', $person, FILE_APPEND | LOCK_EX);
0 голосов
/ 07 февраля 2012

Вы можете использовать nohup для запуска процесса в фоновом режиме:

$ nohup binary arguments
$ man nohup
...