我想检查一下Gearman守护程序是否在运行。然后运行任务,因此我的应用程序不会崩溃。
这是我的代码:
$daemonRunning = true;
while( true )
{
try
{
Yii::app()->gearman->client->ping( true );
if ( $daemonRunning === false )
{
echo "Daemon back online. Starting signature process...n";
}
Yii::app()->gearman->client->runTasks();
}
catch( GearmanException $e )
{
echo "Daemon appears to be down. Waiting for it to come back up...n";
$daemonRunning = false;
}
sleep(1);
}
,但问题是ping
没有引发异常,这会造成致命错误:
PHP Error[2]: GearmanClient::ping(): flush(GEARMAN_COULD_NOT_CONNECT) 127.0.0.1:4730 -> libgearman/connection.cc:673
尽管奇怪,如果我删除ping
,并且仅使用runTasks
,则会抛出一个例外。
相关:
当Gearman Daemon在运行时如何处理错误?当我放下档位守护程序时,我会从PHP中遇到以下错误:
php: libgearman/universal.cc:481: gearman_return_t connection_loop(gearman_universal_st&, const gearman_packet_st&, Check&): Assertion `&con->_packet == universal.packet_list' failed.
Aborted (core dumped)
在最基本的情况下,可以使用:
来检查齿轮服务器的状态: (echo status ; sleep 0.1) | nc 127.0.0.1 4730 -w 1
但是,如此问题所述,您可以使用fsocketopen
获得Gearman Server的HE状态。
// Taken from https://stackoverflow.com/questions/2752431/any-way-to-access-gearman-administration
class Waps_Gearman_Server {
/**
* @var string
*/
protected $host = "127.0.0.1";
/**
* @var int
*/
protected $port = 4730;
/**
* @param string $host
* @param int $port
*/
public function __construct($host=null,$port=null){
if( !is_null($host) ){
$this->host = $host;
}
if( !is_null($port) ){
$this->port = $port;
}
}
/**
* @return array | null
*/
public function getStatus(){
$status = null;
$handle = fsockopen($this->host,$this->port,$errorNumber,$errorString,30);
if($handle!=null){
fwrite($handle,"statusn");
while (!feof($handle)) {
$line = fgets($handle, 4096);
if( $line==".n"){
break;
}
if( preg_match("~^(.*)[ t](d+)[ t](d+)[ t](d+)~",$line,$matches) ){
$function = $matches[1];
$status['operations'][$function] = array(
'function' => $function,
'total' => $matches[2],
'running' => $matches[3],
'connectedWorkers' => $matches[4],
);
}
}
fwrite($handle,"workersn");
while (!feof($handle)) {
$line = fgets($handle, 4096);
if( $line==".n"){
break;
}
// FD IP-ADDRESS CLIENT-ID : FUNCTION
if( preg_match("~^(d+)[ t](.*?)[ t](.*?) : ?(.*)~",$line,$matches) ){
$fd = $matches[1];
$status['connections'][$fd] = array(
'fd' => $fd,
'ip' => $matches[2],
'id' => $matches[3],
'function' => $matches[4],
);
}
}
fclose($handle);
}
return $status;
}
}
关于您的第二个问题,当连接丢失中期时,我从来没有能够恢复变速杆工人。基本上,您必须杀死运行客户工作人员的整个过程,并让主管重新重新启动另一个工作过程。Gearman客户的工作人员应该是极端的短暂的。您应该定期监视它们以进行内存使用,并自动杀死它们。因此,如果您曾经击中Segfault/Coredump,那么杀死该工人是完全正常的。
如前所述,您可以使用主管自动启动工人。还要检查一下,它说明了如何使Gearman客户与主管合作