2010-05-16 7 views
4

Je suis actuellement en train d'utiliser CURL via un script php fonctionnant en tant que cron quotidien pour exporter des données de produits au format csv à partir de la zone d'administration d'un site.Demande CURL incomplète, suspecte timeout mais je ne sais pas

La manière normale d'exporter des données sera d'aller à la page d'exportation dans un navigateur, et de définir la configuration, puis cliquez sur le bouton "exporter des données". Mais comme le nombre de produits que j'exporte est très important, et qu'il faut plus de 5 à 10 minutes pour exporter les données, j'ai décidé d'utiliser la fonction curl de php pour l'imiter tous les jours via cron.

Auparavant, il fonctionnait bien, mais récemment, comme j'ai augmenté le nombre de produits dans le magasin de plus de 500, le script ne parvient pas à renvoyer les données exportées. Le tester manuellement en cliquant sur le bouton "exporter" dans un navigateur, renvoie les données correctement. Il n'y a donc pas de problème de "timeout" avec l'exécution manuelle de l'exportation dans un navigateur.

J'ai testé et en retirant/diminuant le nombre de produits (donc le temps nécessaire), le script php-curl fonctionne à nouveau correctement lorsqu'il est exécuté à partir de cron.

Donc je soupçonne que cela a quelque chose à voir avec le problème des délais d'attente, en particulier avec la fonction curl en php.

J'ai défini à la fois CURLOPT_TIMEOUT et CURLOPT_CONNECTTIMEOUT sur '0' pour essayer. Dans le script php-curl, j'ai également défini "set_time_limit (3000)". Mais cela ne fonctionne toujours pas et la requête expirera, le script ne retournant pas avec un jeu complet de données csv.

Toute aide pour m'aider à résoudre/comprendre ce problème sera grandement appréciée! Modifié: Ajout d'une partie du code où le script curl appelle la fonction d'exportation.

$interface = new StoreInterface(); 
echo "Start exporting at " . date('l jS \of F Y h:i:s A') . "\n"; 
set_time_limit(3000); 
$result_html = $interface->exportProducts(); 
//parse $result_html to only retain the csv format 
preg_match('/<pre>(.*)<\/pre>/s',$result_html[0],$output); 
if(strlen($output[1])<10) { //debugging for now 
echo "Export did not happen correctly. Quit\n"; 
    die('Export unsuccessful'); 
} 
file_put_contents($output_path,$output[1]); 
echo "Script completed. Thank you! \n"; 
+0

Y a-t-il un message d'erreur spécifique? Avez-vous des résultats seulement partiels? – Artefacto

+0

Il n'y a pas de message d'erreur spécifique. Yeap, seulement des résultats partiels. Le script sort les données csv sous la forme d'un fichier temporaire dans le serveur lorsque la fonction "export" est appelée dans le script du magasin par le script curl. Si elle réussit, elle doit renvoyer le contenu complet du fichier temporaire au script curl à traiter. Mais dans le cas présent, le contenu du fichier temporaire s'arrête brusquement à mi-chemin et le script curl retournera indiquant que les données sont incomplètes. – girlygeek

+0

Avez-vous vérifié vos journaux d'erreurs? –

Répondre

2

Vous pouvez utiliser les options curl suivantes pour consigner tous les détails de transfert de boucle dans un fichier journal et vérifier les éventuels problèmes.

$fp = fopen('./debug/transfer.log'); 
curl_setopt($curl, CURLOPT_VERBOSE, TRUE); 
curl_setopt($curl, CURLOPT_STDERR, $fp); 

Je crois aussi que l'option CURLOPT_TIMEOUT ne prend pas en charge la spécification d'une valeur « 0 » pour un délai d'attente indéfinie. Vous devez spécifier la valeur du délai d'expiration maximum ici. Que voulez-vous dire par "le temps de script"?

+0

Je vais essayer cette méthode et voir comment. Je vous remercie. – girlygeek

Questions connexes