2012-10-27 5 views
1

Comment puis-je déterminer le paramètre de requête $ maximum reçu par la fonction mysqli_multi_query (ou mysqli_query), en PHP? J'ai un programme php qui génère une grande chaîne de commandes UPDATE sql, séparées par ';' Le problème est que si cette chaîne dépasse une certaine longueur mysqli_query génère une erreur comme "le serveur MySQL est parti". Je remarque que cette longueur semble être d'environ 1 Mo, mais comment puis-je l'examiner afin de pouvoir m'assurer de ne jamais dépasser cette longueur?longueur de requête maximale dans mysqli_query

Le script doit exécuter environ 7 000 mises à jour, sur 25 champs. L'exécution d'une mise à jour à la fois s'est révélée très lente. La concaténation de plusieurs mises à jour s'exécute beaucoup plus rapidement.

Une possibilité d'exécuter plusieurs requêtes encore plus rapidement?

Merci d'avance pour tout conseil!

+0

Je pense que ce n'est pas la longueur de la chaîne, mais le temps nécessaire pour exécuter toutes les instructions. – GolezTrol

+0

Si je l'exécute dans phpmyadmin il s'exécute en 3 secondes –

+0

Veuillez lire à nouveau ma réponse. J'ai ajouté quelque chose sur "plusieurs requêtes encore plus vite" après avoir accepté mon message. – Kamil

Répondre

5

Vous devriez consulter les journaux d'erreurs de MySQL.

Si vous n'avez pas accès à la machine (hébergement, etc.), vous pouvez demander à votre administrateur ou votre service d'assistance pour ce journal.

MySQL prend en charge de très grandes requêtes. Je ne sais pas s'il y a une limite, mais lorsque vous utilisez le réseau - vous pouvez avoir un problème avec taille de paquet.

Vous pouvez vérifier --max_allowed_packet dans la configuration de MySQL, et essayer de définir une plus grande taille de paquet. Je ne suis pas sûr de la configuration par défaut, mais il peut s'agir de 1 Mo, ce qui peut être une valeur trop faible pour obtenir une requête avec 7 000 mises à jour à la fois. MySQL peut avoir besoin de plus de RAM pour traiter une requête comme celle-ci.

Si vous ne pouvez pas reconfigurer MySQL, vous devez scinder votre grande requête en requêtes plus petites.

Vous pouvez également lire pour plus d'informations:

devshed - MySQL server has gone away

Vous avez demandé:

Toute possibilité d'exécuter plusieurs requêtes encore plus rapide?

Il n'y a pas de réponse simple à cette question.

Augmenter la taille du cache MySQL dans le fichier de configuration peut aider beaucoup dans la plupart des cas avec de grandes mises à jour simples avec peu de calcul, car le moteur de base de données fonctionne sur la mémoire RAM, pas sur le disque dur . Lorsque le grand cache est utilisé - parfois la première grande requête peut être plus lente, car les données ne sont pas encore chargées dans la RAM, mais quand elles sont finalement chargées - les requêtes nécessitant beaucoup d'opérations de lecture/écriture fonctionneront beaucoup plus rapidement.

ajouté plus tard: Je suppose que votre traitement de données a besoin fonction php deserialize() qui peut être difficile à mettre en œuvre dans SQL pur et vous devez le faire en PHP :) Si vous avez accès à la console du serveur, vous pouvez créer cron (linux sheduler) job, qui appelle le script PHP du shell pendant la nuit.

Ajouté plus tard plus tard Après discussion dans les commentaires, j'ai une idée de plus. Vous pouvez effectuer une sauvegarde complète de la base de données ou d'une table à partir de phpmyadmin, la télécharger, restaurer les données sur l'ordinateur personnel (sous Windows, vous pouvez utiliser XAMPP, serveur WAMP). Sur votre ordinateur personnel, vous pouvez exécuter mysql.exe et traiter les données localement.

+0

Je veux enregistrer les accès au site et j'utilise une table avec les premiers champs comme ID, get, post, serveur, cookies. Je stocke les variabilités sérialisées dans le champ thosed, aux temps d'accès. Lorsque j'accède au journal, je désérialise (à ce stade, j'exécute ces 7000 UPDATEs) ces champs et les écris dans des champs auxiliaires, comme server_HTTP_REFERER, server_REMOTE_IP, ou post_page. Je veux exporter la table et l'analyser dans un tableur –

+0

je vois. Pouvez-vous reconfigurer ce serveur? – Kamil

+0

Malheureusement non –

0

J'ai trouvé une limite de 16 paires de champs/valeurs dans une instruction INSERT. Au-delà de ce nombre j'ai eu une erreur "Interdit". La longueur totale de l'instruction INSERT dans la déclaration de travail était de 392 caractères.

0

Utilisez une boucle for pour effectuer un gros travail et utilisez simplement mysqli_query. J'ai eu plus de 16000 requêtes à faire comme ça. Certaines choses doivent également être changées dans le fichier php.ini. la taille de post mb doit changer. Faites-en la plus grande possible si vous envoyez beaucoup de caractères. var input max devrait aussi être changé si vous envoyez beaucoup de variables différentes. Augmentez la taille de la mémoire php. Assurez-vous de ne pas manquer de mémoire système lors de l'exécution des requêtes. Si vous faites tout correctement, vous pouvez envoyer plus de 20000 requêtes. Réglez la mémoire php à au moins 256mb. Vous devrez peut-être augmenter les délais d'expiration de 30 et 60 à 200 ou plus, parfois si vous envoyez de très grandes quantités de requêtes. Si vous ne modifiez aucun paramètre, votre message échouera même si tout est vrai. PHP rendra les conditions du script fausses si vous dépassez les limites/maxes de php.ini. Vous n'avez pas besoin de modifier les paramètres mysql un par un. Il faudra un certain temps si vous insérez ou mettez à jour quelque chose sur plus de 1000 requêtes.

+0

Je n'arrive pas à voir où est votre question? – Jhecht