从用PHP编写的守护进程的mysql连接

时间:2010-10-31 13:13:51

标签: php mysql daemon command-line-interface mysql-pconnect

我已经编写了一个守护进程来从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;
} 

2 个答案:

答案 0 :(得分:1)

从技术上讲,如果它是一个守护进程,它会在后台运行,并且在你要求之前不会停止。在这种情况下,不需要使用持久连接,甚至,您可能不应该这样做。当我杀死守护进程时,我希望连接关闭。

基本上,你应该在启动时打开一个连接,并在关机时关闭它,这就是它。但是,如果在守护程序运行时连接意外断开,则应该在其中放置一些错误捕获,因此它要么正常关闭(通过在某处记录连接丢弃),要么稍后重试重新连接。

答案 1 :(得分:0)

也许在while语句之前只添加mysql_pconnect,但我现在没有关于php守护进程的任何内容......