2010-10-31 3 views
1

J'ai écrit un démon pour aller chercher des trucs dans mysql et faire des requêtes curl basées sur les infos de mysql. depuis que je parle couramment php, j'ai écrit ce démon en php en utilisant System_Daemon de pear. Cela fonctionne très bien, mais je suis curieux de connaître la meilleure approche pour me connecter à mysql. se sent bizarre de créer une nouvelle connexion mysql toutes les deux secondes, devrais-je essayer une connexion persistante? toute autre entrée? Il est essentiel de limiter au maximum les pertes de mémoire potentielles ...connexion mysql à partir d'un démon écrit en php

nettoyé le script ci-dessous. supprimé les trucs de MySQL pour l'instant, en utilisant un faux tableau pour garder ce non biaisé:

#!/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; 
} 

Répondre

1

Techniquement, si c'est un démon, il fonctionne en arrière-plan et ne s'arrête pas jusqu'à ce que vous le demandiez. Il n'y a pas besoin d'utiliser une connexion persistante dans ce cas, et même, vous ne devriez probablement pas. Je m'attendrais à ce que la connexion se ferme quand je tue le démon.

Fondamentalement, vous devez ouvrir une connexion au démarrage, et fermez-la à l'arrêt, et c'est à peu près tout. Cependant, vous devriez mettre un piégeage d'erreur là-bas au cas où la connexion tomberait de façon inattendue pendant que le démon est en cours d'exécution, soit il se ferme normalement (en enregistrant une connexion quelque part), soit il réessaie plus tard.

+0

+1, cela fonctionne. En règle générale, lorsque j'écris quelque chose comme, il ouvre une connexion régulière au démarrage, et l'utilise pour la durée. Si une requête échoue, essayez de vous reconnecter plusieurs fois, et si cela ne fonctionne pas, échouez gracieusement. – timdev

0

peut-être avant while juste ajouter mysql_pconnect, mais je ne le font pas maintenant rien php ... daemons

+0

cela semble être une bonne approche. ou placez-le dans la boucle while et vérifiez is_resource pour voir si la connexion existe, sinon recréez-la. va essayer quelque chose comme ça. d'autres? – fjallstrom