сокеты — непрерывно запускайте скрипт Php

Я написал 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 заканчивается через несколько часов. Поскольку мне нужно запустить скрипт в фоновом режиме, пока я не остановлю его вручную.
в чем может быть проблема?
заранее спасибо

1

Решение

Вы должны четко понимать, чем php не предполагается использовать для таких вещей. PHP-скрипт запускается, выполняет некоторую работу и умирает — вот его судьба. И любой демон, которого вы создадите на php, умрет по какой-то причине.

Но очень легко создавать демонов на php. так что нам делать?

Для сценариев демона вы должны реализовать руководитель.

Во-первых, у вас есть сценарий, как вы описали выше. Иногда полезно реализовать некоторые условия прерывания для этого сценария, такие как ограничение памяти процесса через memory_get_usage

Во-вторых, вы реализуете сценарий супервизора для своего демона. Что это такое? Просто какой-нибудь скрипт, который вы должны вызывать каждую минуту из cron. Этот скрипт будет:

  1. Проверьте, работает ли ваш демон-скрипт. Для этой цели можно использовать текущие процессы через оболочку.
  2. Запустите другой экземпляр, если ваш демон завершен.
  3. Выход

Концепция супервизора очень полезна. Там можно реализовать любую бизнес-логику, например, запустить ровно количество экземпляров демона. Это замечательно для таких сценариев, как потребители RabbitMQ.

1

Другие решения

Вы можете запустить свой скрипт в цикле с sleep упомянутое время для сна на несколько секунд. Например:

while(1 < 2) {
//your code
sleep(1);
}

Тогда вы можете использовать nohup команда как

nohup php yourscript.php &

Чтобы он работал в фоновом режиме и проверял, работает ли он. использование top команда, чтобы увидеть фоновую часть, она будет работать с командой php в топ-процессах.

0

По вопросам рекламы [email protected]