我使用System_Daemon通过PHP创建一个守护进程。该守护进程将查看一个文件夹并监视是否有一个带有命令的文件然后执行它。这是我的代码:
#!/usr/bin/php -q
<?php
define('_WEB_DIR', dirname(__FILE__ ));
define('_DAEMON_CMD_FILE', dirname(__FILE__ ).'/daemon/cmd.sh');
// Include Class
error_reporting(E_ALL);
require_once "System/Daemon.php";
$options = array(
"appName" => "serverhandler",
"appDir" => dirname(__FILE__),
"appDescription" => "Runn commands to control web service ( httpd | nginx | lightpd ... )",
"authorName" => "Jerry Pham",
"authorEmail" => "author@email.com",
"sysMaxExecutionTime" => "0",
"sysMaxInputTime" => "0",
"sysMemoryLimit" => "1024M"
);
System_Daemon::setOptions($options);
System_Daemon::start();
while (!System_Daemon::isDying() )
{
if( file_exists( _DAEMON_CMD_FILE ) )
{
$cmd = file_get_contents( _DAEMON_CMD_FILE );
unlink( _DAEMON_CMD_FILE );
$result = system( $cmd );
System_Daemon::log(System_Daemon::LOG_NOTICE, "Excuted command {$cmd} : {$result}");
}
}
System_Daemon::stop();
?>
但运行~2小时后,cpu使用率为80%,内存为1.1%。有人可以帮我解释一下这个CPU问题以及如何修复。
非常感谢。
答案 0 :(得分:1)
我找到了原因,只需将usleep(1000); //0.1 second
放入while循环中:
while (!System_Daemon::isDying() )
{
if( file_exists( _DAEMON_CMD_FILE ) )
{
$cmd = file_get_contents( _DAEMON_CMD_FILE );
unlink( _DAEMON_CMD_FILE );
$result = system( $cmd );
System_Daemon::log(System_Daemon::LOG_NOTICE, "Excuted command {$cmd} : {$result}");
}
usleep(1000);
}
我认为System_Daemon会为我们睡觉,但似乎没有。
答案 1 :(得分:0)
如果可以的话,你应该使用“System_Daemon :: iterate()”
while (!System_Daemon::isDying())
{
//do something
System_Daemon::iterate(1); //sleep 1 sec and do clearstatcache()
}