1

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

2 回答 2

1

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

基本上,您应该在启动时打开一个连接,并在关闭时关闭它,仅此而已。但是,您应该在其中设置一些错误捕获,以防在守护程序运行时连接意外断开,因此它要么优雅地关闭(通过在某处记录连接断开),要么稍后重试重新连接。

于 2010-10-31T18:19:00.123 回答
0

也许在while语句之前只添加mysql_pconnect,但我现在对php守护进程一无所知......

于 2010-10-31T13:27:36.103 回答