Я написал server.php, чтобы принять соединение от клиента через сокет TCP.
и у меня есть использование
set_time_limit(0);
include_once("include/class.db.php");
while (true)
{
receive_message('x.x.x.x','8855',50);
}
function receive_message($ipServer,$portNumber,$nbSecondsIdle)
{
// creating the socket...
$socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
if (!$socket)
{
echo "$errstr ($errno)<br />\n";
}
else
{
// while there is connection, i'll receive it... if I didn't receive a message within $nbSecondsIdle seconds, the following function will stop.
while ($conn = @stream_socket_accept($socket,$nbSecondsIdle))
{
$message= fread($conn, 1024);
if($message!=''){
echo 'I have received that : '.$message;
// insert into database
$sql = "insert into `data_log` (`id`,`message_text`) values (NULL,'$message')";
$query=mysql_query($sql) or die(mysql_error() . "<br>" . $sql);
}
fputs ($conn, "OK\n");
fclose ($conn);
}
fclose($socket);
}
}
Тогда я бегу
nohup php server.php >/dev/null 2>&1 &
запустить сервер в фоновом режиме. Все отлично работает. Но сокет автоматически закрывается через несколько часов, или, скажем, скрипт php заканчивается через несколько часов. Поскольку мне нужно запустить скрипт в фоновом режиме, пока я не остановлю его вручную.
в чем может быть проблема?
заранее спасибо
Вы должны четко понимать, чем php не предполагается использовать для таких вещей. PHP-скрипт запускается, выполняет некоторую работу и умирает — вот его судьба. И любой демон, которого вы создадите на php, умрет по какой-то причине.
Но очень легко создавать демонов на php. так что нам делать?
Для сценариев демона вы должны реализовать руководитель.
Во-первых, у вас есть сценарий, как вы описали выше. Иногда полезно реализовать некоторые условия прерывания для этого сценария, такие как ограничение памяти процесса через memory_get_usage
Во-вторых, вы реализуете сценарий супервизора для своего демона. Что это такое? Просто какой-нибудь скрипт, который вы должны вызывать каждую минуту из cron. Этот скрипт будет:
Концепция супервизора очень полезна. Там можно реализовать любую бизнес-логику, например, запустить ровно количество экземпляров демона. Это замечательно для таких сценариев, как потребители RabbitMQ.
Вы можете запустить свой скрипт в цикле с sleep
упомянутое время для сна на несколько секунд. Например:
while(1 < 2) {
//your code
sleep(1);
}
Тогда вы можете использовать nohup
команда как
nohup php yourscript.php &
Чтобы он работал в фоновом режиме и проверял, работает ли он. использование top
команда, чтобы увидеть фоновую часть, она будет работать с командой php в топ-процессах.