我已经编写了一个守护进程来从mysql中获取一些东西并根据mysql的信息发出一些curl请求。因为我能说流利的PHP,所以我使用来自pear的System_Daemon在php中编写了这个守护进程。
这工作正常,但我很好奇连接到mysql的最佳方法。如果我尝试持久连接,每隔几秒钟创建一个新的mysql连接会感觉很奇怪吗?任何其他输入?将潜在的内存泄漏降至最低是至关重要的......
清理了下面附带的脚本。暂时移除了mysql的东西,使用虚拟数组来保持这种无偏见:
#!/usr/bin/php -q
<?php
require_once "System/Daemon.php";
System_Daemon::setOption("appName", "smsq");
System_Daemon::start();
$runningOkay = true;
while(!System_Daemon::isDying() && $runningOkay){
$runningOkay = true;
if (!$runningOkay) {
System_Daemon::err('smsq() produced an error, '.
'so this will be my last run');
}
$messages = get_outgoing();
$messages = call_api($messages);
#print_r($messages);
System_Daemon::iterate(2);
}
System_Daemon::stop();
function get_outgoing(){ # get 10 rows from a mysql table
# dummycode, this should come from mysql
for($i=0;$i<5;$i++){
$message->msisdn = '070910507'.$i;
$message->text = 'nr'.$i;
$messages[] = $message;
unset($message);
}
return $messages;
}
function call_api($messages=array()){
if(count($messages)<=0){
return false;
}else{
foreach($messages as $message){
$message->curlhandle = curl_init();
curl_setopt($message->curlhandle,CURLOPT_URL,'http://yadayada.com/date.php?text='.$message->text);
curl_setopt($message->curlhandle,CURLOPT_HEADER,0);
curl_setopt($message->curlhandle,CURLOPT_RETURNTRANSFER,1);
}
$mh = curl_multi_init();
foreach($messages as $message){
curl_multi_add_handle($mh,$message->curlhandle);
}
$running = null;
do{
curl_multi_exec($mh,$running);
}while($running > 0);
foreach($messages as $message){
$message->api_response = curl_multi_getcontent($message->curlhandle);
curl_multi_remove_handle($mh,$message->curlhandle);
unset($message->curlhandle);
}
curl_multi_close($mh);
}
return $messages;
}
答案 0 :(得分:1)
从技术上讲,如果它是一个守护进程,它会在后台运行,并且在你要求之前不会停止。在这种情况下,不需要使用持久连接,甚至,您可能不应该这样做。当我杀死守护进程时,我希望连接关闭。
基本上,你应该在启动时打开一个连接,并在关机时关闭它,这就是它。但是,如果在守护程序运行时连接意外断开,则应该在其中放置一些错误捕获,因此它要么正常关闭(通过在某处记录连接丢弃),要么稍后重试重新连接。
答案 1 :(得分:0)
也许在while语句之前只添加mysql_pconnect,但我现在没有关于php守护进程的任何内容......