Le PHP suivant a fonctionné pour moi (en utilisant l'extension mysqli mais les requêtes devraient être les mêmes pour d'autres extensions) :
$db = new mysqli( 'localhost', 'user', 'pass', 'dbname' );
// to get the max_allowed_packet
$maxp = $db->query( 'SELECT @@global.max_allowed_packet' )->fetch_array();
echo $maxp[ 0 ];
// to set the max_allowed_packet to 500MB
$db->query( 'SET @@global.max_allowed_packet = ' . 500 * 1024 * 1024 );
Donc, si vous avez une requête que vous attendez être très longue, vous pouvez vous assurer que MySQL l'acceptera avec quelque chose comme ceci :
$sql = "une requête SQL vraiment longue...";
$db->query( 'SET @@global.max_allowed_packet = ' . strlen( $sql ) + 1024 );
$db->query( $sql );
Remarquez que j'ai ajouté 1024 octets supplémentaires à la longueur de la chaîne car selon le manuel,
La valeur doit être un multiple de 1024; les non-multiples sont arrondis au multiple inférieur.
Ça devrait normalement définir la taille max_allowed_packet assez grande pour gérer votre requête. Je n'ai pas testé cela sur un hébergeur partagé, donc la même mise en garde que @Glebushka s'applique.