2016-10-25 7 views
1

Я написал server.php, чтобы принимать соединение от клиента через tcp socket. и у меня есть использоватьЗапустите Php Script на фоне фона

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

+0

хорошо - вы можете начать поиск и устранение неисправностей при подключении вывода вашей программы в файл журнала вместо/dev/null. и в качестве предварительной меры вы можете время от времени записывать проверку cronjob, если ваш скрипт все еще работает, и перезапускать его, если нет. –

+0

Возможно, через некоторое время соединение db было закрыто, а выполнение скрипта остановлено или у вас закончилась нехватка памяти. Сначала проверьте подключение. –

+0

@FranzGleichmann, используя файл вместо/dev/null, создает огромный файл около 20 гб всего за один день. поэтому я использую/dev/null –

ответ

0

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

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

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

nohup php yourscript.php & 

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

1

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

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

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

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

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

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

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

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

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