2010-10-31 98 views
1

我已经编写了一个守护进程来从mysql获取一些内容,并根据来自mysql的信息做出一些curl请求。因为我流利的PHP我已经使用来自pear的System_Daemon在php中编写了这个守护进程。来自使用php编写的守护进程的mysql连接

这工作正常,但我很好奇连接到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; 
} 

回答

1

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

基本上,您应该在启动时打开连接,并在关闭时关闭它,就是这样。但是,如果连接在运行时会意外降低,您应该在其中放置一些错误陷阱,以便它可以正常关闭(通过记录某个连接),或者稍后重试连接。

+0

+1,这个工程。通常,当我编写类似的东西时,它会在启动时打开常规连接,并在持续时间内使用它。如果查询失败,请尝试重新连接几次,如果不起作用,则优雅地失败。 – timdev 2010-10-31 18:31:11

0

也许之前while语句只是增加mysql_pconnect,但我不知道现在关于PHP守护什么...

+0

这听起来很不错。或者将它放在while循环中并检查is_resource以查看连接是否存在,否则重新创建它。会尝试这样的事情。任何其他? – fjallstrom 2010-10-31 13:52:35