2010-10-06 4 views
1

Je possède ce code:des questions curl PHP - en cours d'exécution à plusieurs reprises

<?php 

foreach($items as $item) { 

    $site = $item['link']; 
    $id = $item['id']; 
    $newdata = $item['data_a']; 
    $newdata2 = $item['data_b']; 

    $ch = curl_init($site.'updateme.php?id='.$id.'&data1='.$newdata.'&data2='.$newdata2); 
    curl_exec ($ch); 
    // do some checking here 
    curl_close ($ch); 

} 

?> 

entrée de l'échantillon:

$site = 'http://www.mysite.com/folder1/folder2/'; 

$id = 512522; 

$newdata = 'Short string here'; 

$newdata = 'Another short string here with numbers'; 

Voici le processus principal de updateme.php

if (!$id = intval(Tools::getValue('id'))) 
    $this->_errors[] = Tools::displayError('Invalid ID!'); 
else 
{ 
    $history = new History(); 
    $history->id = $id; 
    $history->changeState($newdata1, intval($id)); 
    $history->id_employee = intval($employee->id_employee); 
    $carrier = new Carrier(intval($info->id_carrier), intval($info->id_lang)); 
    $templateVars = array('{delivery}' => ($history->id_data_state == _READY_TO_SEND AND $info->shipping_number) ? str_replace('@', $info->shipping_number, $carrier->url) : ''); 
    if (!$history->addWithemail(true, $templateVars)) 
     $this->_errors[] = Tools::displayError('an error occurred while changing status or was unable to send e-mail to the employee'); 
} 

le site change toujours et chaque $ $ aura au moins 20 données à l'intérieur de sorte que la boucle foreach fonctionnera au moins 20 fois ou plus sur le nombre de données.

Le site cible mettra à jour sa base de données avec les variables passées, il passera probablement au moins 5 fonctions avant qu'il ne soit sauvegardé dans la base de données, donc cela pourrait probablement prendre du temps aussi.

Ma question est: y aura-t-il un problème avec cette approche? Le script rencontre-t-il une erreur de dépassement de délai lors du processus de bouclage? Que diriez-vous si les données $ items sont autour de 50 ou dans les centaines maintenant?

Ou y a-t-il une meilleure façon de faire cela?

MISES À JOUR: * Ajout du code de processus principal updateme.php. Informations supplémentaires: updateme.php enverra également un e-mail en fonction des variables transmises.

  • Tous les autres sites sont actuellement hébergés sur le même serveur.
+0

C'est presque certainement un moyen inefficace de le faire. Est-ce que toutes les requêtes curl seront sur des serveurs différents, ou seront-ils tous sur le même serveur? Si oui, pouvez-vous modifier le code en 'updateme.php'? – lonesomeday

+0

À l'heure actuelle, toutes les requêtes curl seront dans le même serveur. – GoDesigner

Répondre

0

Vous pouvez avoir un problème d'exécution PHP.
Pour votre problème de délai d'attente, vous pouvez le "réparer" en utilisant l'option CURLOPT_TIMEOUT.

+0

Une suggestion sur la façon dont je pourrais exécuter le updateme.php de différents sites sans rencontrer le problème de temps d'exécution de PHP? Fopen sera-t-il mieux? – GoDesigner

+0

Puisque vous êtes sur le même serveur, ne pouvez-vous supprimer curl et intégrer updateme.php dans votre script global (dans la boucle foreach)? – Spilarix

+0

updateme.php est juste un fichier de processus, l'information de base de données est différente de chaque site et le script global n'a pas accès à cette information. Comment pourrais-je mettre à jour la base de données pour chaque site si je le fais de cette façon? Ou suis-je en train de lire votre suggestion dans le mauvais sens? – GoDesigner

0

Étant donné que le script cURL qui appelle updateme.php n'attend pas de réponse, vous devez faire en sorte que updateme.php revienne au début.

http://gr.php.net/register_shutdown_function

 
function shutdown() { 
    if (!$id = intval(Tools::getValue('id'))) 
     $this->_errors[] = Tools::displayError('Invalid ID!'); 
    else 
    { 
     $history = new History(); 
     $history->id = $id; 
     $history->changeState($newdata1, intval($id)); 
     $history->id_employee = intval($employee->id_employee); 
     $carrier = new Carrier(intval($info->id_carrier), intval($info->id_lang)); 
     $templateVars = array('{delivery}' => ($history->id_data_state == _READY_TO_SEND AND $info->shipping_number) ? str_replace('@', $info->shipping_number, $carrier->url) : ''); 
     if (!$history->addWithemail(true, $templateVars)) 
      $this->_errors[] = Tools::displayError('an error occurred while changing status or was unable to send e-mail to the employee'); 
    } 
} 

register_shutdown_function('shutdown'); 

exit(); 

Vous pouvez utiliser set_time_limit(0) (0 signifie aucune limite de temps) pour modifier le délai d'attente de l'exécution du script PHP. CURLOPT_TIMEOUT est l'option cURL pour définir le délai d'attente, mais je pense qu'elle est illimitée par défaut, vous n'avez donc pas besoin de définir cette option sur votre handle.

Questions connexes