Programmation PHP/Problèmes connus
Le processus de débogage est relativement le même d'un bug à l'autre :
- En cas d'erreur 400, regarder d'abord les logs les plus spécifiques (ex : le var/log de l'application), puis les logs des serveurs Web (ex : /var/log/nginx), puis ceux du système (/var/log).
- En cas d'erreur 500 ou de non réponse, passer directement aux logs des serveurs.
- En cas d'absence de log, localiser le problème avec :
La liste suivante doit permettre de gagner du temps pour solutionner les erreurs que l'on peut trouver dans les logs.
Erreurs sans message PHP
[modifier | modifier le wikicode]IIS tourne dans le vide après la mise à jour de PHP
[modifier | modifier le wikicode]Vérifier que les dépendances sont bien installées (ex : Visual C++)[1].
Les modifications du php.ini ne sont pas prises en compte dans phpinfo
[modifier | modifier le wikicode]Sur Wamp, redémarrer PHP et Apache ne suffit pas car Apache contient une copie du php.ini dans C:\wamp64\bin\apache\apache2.4.54.2\bin, créée lors de la sélection de la version de PHP (au clic sur PHP/Version).
La connexion a été réinitialisée
[modifier | modifier le wikicode]Erreur sous Firefox provenant d'un mysql_close()
ou d'une directive Apache.
La page n'est pas redirigée correctement
[modifier | modifier le wikicode]Un header
revient en boucle après une suite de conditions. S'il est local, le remplacer par chdir()
.
Le code PHP n'est pas interprété (et est affiché)
[modifier | modifier le wikicode]Si a2enmod php7.4
indique que le module est déjà installé, c'est peut-être lié à a2enmod userdir
. Cela peut se régler avec :
vim /etc/apache2/mods-enabled/php7.4.conf
Commenter les lignes :
<IfModule mod_userdir.c>
...
</IfModule>
Et relancer Apache.
Sinon c'est peut-être le vhost utilisé qui n'est pas le bon (voir /var/log/apache2) ou qu'il ne contient pas :
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
Require all granted
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Allow from all
</Directory>
Les dernières lignes d'un POST sont ignorées
[modifier | modifier le wikicode]Il faut soit augmenter la variable PHP max_input_vars (ce qui ne peut pas être fait avec ini_set()
[2]), soit il faut fragmenter en plusieurs requêtes, par exemple toutes les 300 lignes.
Un regex marche sur https://regex101.com/ mais pas en local
[modifier | modifier le wikicode]Si la machine est Windows, tenir compte de la différence de retour chariot : \r\n
au lieu de \n
.
Une addition ou soustraction de dates ajoute ou retire un jour
[modifier | modifier le wikicode]Cela survient quand on part d'un mois à 31 jours pour arriver à un mois qui en a moins.
Par exemple :
var_dump((new DateTime('2024-12-31'))->add(new DateInterval("P6M"))); // 2025-07-01 00:00:00 var_dump((new DateTime('2024-12-31'))->add(new DateInterval("P12M"))); // 2025-12-31 00:00:00
Pour avoir un calcul juste, on peut ajuster le jour du résultat ainsi :
$startDate = new DateTime('2024-12-31'); $originalDay = $startDate->format('d'); $startDate->add(new DateInterval('P6M')); if ($startDate->format('d') !== $originalDay) { // Ajuster au dernier jour du mois précédent $startDate->modify('last day of previous month'); } var_dump($startDate); // 2025-06-30 00:00:00
Une addition ou soustraction de dates ajoute ou retire une heure
[modifier | modifier le wikicode]C'est à cause des changements d'heure d'hiver et heure été.
Par exemple :
var_dump((new DateTime('2024-12-31'))->add(new DateInterval("PT4320H"))); // 2025-06-29 01:00:00 var_dump((new DateTime('2024-12-31'))->add(new DateInterval("PT8640H"))); // 2025-12-26 00:00:00
Pour avoir un calcul juste, on peut changer de fuseau horaire le temps du calcul, vers un qui n'est pas soumis aux changements d'heures[3] :
var_dump((new DateTime('2024-12-31 UTC'))->add(new DateInterval("PT4320H"))); // 2025-06-29 00:00:00 var_dump((new DateTime('2024-12-31 UTC'))->add(new DateInterval("PT8640H"))); // 2025-12-26 00:00:00
ou à l'échelle du serveur :
$timeZone = date_default_timezone_get(); date_default_timezone_set('UTC'); // calcul date_default_timezone_set($timeZone);
PHP natif
[modifier | modifier le wikicode]Connect Error, 2002: Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée.
[modifier | modifier le wikicode]Relancer le serveur de base de données.
Connect Error, 2002: Une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement au-delà d'une certaine durée ou une connexion établie a échoué car l'hôte de connexion n'a pas répondu.
[modifier | modifier le wikicode]Ouvrir les pare-feux.
Invalid body indentation level (expecting an indentation level of at least 8)
[modifier | modifier le wikicode]En PHP7.3, la syntaxe heredoc impose de supprimer l'indentation de la balise fermante : elle soit suivre "\n".
json_decode renvoie NULL (aléatoirement)
[modifier | modifier le wikicode]Ajouter le paramètre 4 : JSON_THROW_ON_ERROR.
json_decode throw "Control character error, possibly incorrectly encoded"
[modifier | modifier le wikicode]La string à décoder est trop longue.
Malformed UTF-8 characters, possibly incorrectly encoded
[modifier | modifier le wikicode]Changer l'encodage de la chaine avant son encodage en JSON, avec[4] :
$chaine = mb_convert_encoding($chaine, 'UTF-8', 'auto');
MySQL server has gone away
[modifier | modifier le wikicode]La limite des 61 jointures a peut-être été atteinte dans une requête. Sinon vérifier les limites des ressources (du .ini) : par défaut default_socket_timeout égal 60 s.
This extension requires the Microsoft ODBC Driver 11 for SQL Server
[modifier | modifier le wikicode]Installer le pilote depuis https://www.microsoft.com/en-us/download/details.aspx?id=36434.
Unable to initialize module. Module compiled with module API=x. PHP compiled with module API=y. These options need to match
[modifier | modifier le wikicode]Se procurer une autre DLL à renseigner dans PHP.ini.
You can only iterate a generator by-reference if it declared that it yields by-reference
[modifier | modifier le wikicode]Se produit quand on itère sur la référence d'un générateur PHP :
foreach ($generator as &$item) {
...
}
Il faut donc retirer l'opérateur de référence (&) de l'itération...
Cannot traverse an already closed generator
[modifier | modifier le wikicode]Un iterator_to_array($generator)
le ferme en le convertissant en tableau.
child exited on signal 7 (SIGBUS)
[modifier | modifier le wikicode]Modifier le php.ini[5] :
pm.max_children = 80
pm.max_spare_servers = 20
pm.max_requests = 200
apc.stat = 0
max_children est calculé en divisant la RAM par la taille des processus[6].
Invalid resource type: unknown type
[modifier | modifier le wikicode]Le paramètre n°2 de fopen() ne permet pas la lecture[7].
Each stream must be readable
[modifier | modifier le wikicode]On essaie de lire un fichier fermé : déplacer le fclose()
après s'il y en a un avant.
fclose(): supplied resource is not a valid stream resource
[modifier | modifier le wikicode]On essaie de fermer un fichier fermé : utiliser if (is_resource($f))
avant.
SSL peer certificate or SSH remote key was not OK
[modifier | modifier le wikicode]Lors d'un curl_exec
, ajouter :
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
ou :
$options['verify_host'] = false;
$options['verify_peer'] = false;
Fatal error
[modifier | modifier le wikicode][] operator not supported for strings
[modifier | modifier le wikicode]// On récupère une variable dont on ne connait pas le type pour en faire un tableau
if (!isset($tableau1)) {
$tableau1 = array();
} elseif (is_string($tableau1)) {
$tableau1 = array($tableau1);
}
$tableau1[] = 'paramètre suivant';
Allowed memory size of x bytes exhausted
[modifier | modifier le wikicode]Modifier le PHP.ini ou bien ajouter une autre limite dans le programme :
ini_set('memory_limit', '100M');
Pour faire sauter la limitation :
ini_set('memory_limit', '-1');
Si c'est dans une commande :
php -d memory_limit=-1 ma_commande
Si c'est Composer : COMPOSER_MEMORY_LIMIT=-1 ./composer.phar update
Sinon, utiliser Xdebug en mode pas à pas pour visualiser les variables à supprimer (avec unset()
).
Call to a member function ... on a non-object
[modifier | modifier le wikicode]La méthode est invoquée sur une variable qui n'est pas une classe.
Call to undefined function
[modifier | modifier le wikicode]Si une fonction est définie mais qu'on ne peut pas l'invoquer dans une méthode de classe, il faut préalablement l'importer en tenant compte du polymorphisme.
Call to undefined function sqlsrv_connect()
[modifier | modifier le wikicode]Installer le pilote correspondant à la version de PHP du serveur Web :
- Télécharger sur https://www.microsoft.com/en-us/download/details.aspx?id=20098.
- Copier dans le dossier PHP (ex : C:\Program Files (x86)\EasyPHP\binaries\php\php_runningversion\ext).
- Ajouter à PHP.ini.
- Redémarrer le serveur Web.
Call to undefined method
[modifier | modifier le wikicode]La méthode est invoquée sur une classe qui ne l'a pas.
Si elle est censée l'avoir c'est qu'elle n'est pas récupérée, ce qui peut arriver avec les jointures entre entités d'ORM.
Cannot access empty property
[modifier | modifier le wikicode]Une variable non définie ne peut pas fournir de propriété. Si elle était définie ailleurs c'est qu'elle est inaccessible, et donc qu'il faut la récupérer (ex : avec global
).
Error connecting to the ODBC database: [Microsoft][SQL Server Native Client 10.0][SQL Server]échec de l'ouverture de session de l'utilisateur
[modifier | modifier le wikicode]La précédente connexion n'a pas dû être fermée proprement avant une tentative de reconnexion. Essayer au choix :
mysql_close($conn); // MySQL
sqlsrv_close($conn); // MS-SQL
odbc_close($conn); // ODBC
Out of memory
[modifier | modifier le wikicode]Éditer le PHP.ini pour augmenter la ligne :
memory_limit = 256M
pdo_sqlsrv_db_handle_factory: Unknown exception caught
[modifier | modifier le wikicode]Installer et configurer le paquet suivant :
apt-get install -y locales
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
Uncaught exception 'com_exception' with message 'Failed to create COM object `xxx.application': Accès refusé.
[modifier | modifier le wikicode]Sur le serveur Web Windows, dans démarrer, exécuter dcomcnfg (sinon y aller dans Outils d'administration, Service de composants), puis Ordinateurs, Poste de travail, Configuration DCOM, aller dans les propriétés de l'application mentionnée, puis dans l'onglet Sécurité, définir la première permission (Autorisations d'exécution et d'activation à Personnaliser et ajouter le compte du serveur ou site qui exécute le script (ex pour ISS : IIS_IUSRS ou IUSR).
Par exemple pour Word l'application se prénomme "Document Microsoft Office Word", et Excel "Microsoft Excel Application".
Uncaught exception 'com_exception' with message 'Source: Microsoft Office Excel Description: Mémoire insuffisante.
[modifier | modifier le wikicode]Il faut certainement rerégler la Configuration DCOM voire le serveur Web.
Uncaught exception 'PDOException' with message
[modifier | modifier le wikicode]could not find driver
[modifier | modifier le wikicode]Se référer à la liste des pilotes connus dans Programmation PHP/PDO#Installation.
SQLSTATE[HY000]: General error
[modifier | modifier le wikicode]PDO ne gère pas le code SQL "set @ma_variable" ou "if". Donc il faut plutôt faire ces calculs en PHP.
SQLSTATE[28000] [1045] Access denied for user
[modifier | modifier le wikicode]Si l'utilisateur existe avec les privilèges nécessaires, y compris depuis toute localisation (@%), il faut quand-même créer un deuxième compte homonyme pour l'emplacement distant (ex : 'username'@'example.com'). Par exemple dans phpMyAdmin, remplir la provenance mentionnée en erreur ('example.com') dans le champ "Client".
SQLSTATE[28000] SQLConnect: 18456 [Microsoft][ODBC SQL Server Driver][SQL Server] Échec de l'ouverture de session de l'utilisateur
[modifier | modifier le wikicode]Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : la source de données ODBC doit être suivie du compte pour y accéder.
SQLSTATE[IM002] SQLConnect: 0 [Microsoft][Gestionnaire de pilotes ODBC] Source de données introuvable et nom de pilote non spécifié
[modifier | modifier le wikicode]Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : la source de données ODBC doit être créée dans C:\Windows\SysWOW64\odbcad32.exe.
SQLSTATE[IMSSP]: An invalid keyword 'host' was specified in the DSN string
[modifier | modifier le wikicode]Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : le paramètre 'host' est valide pour MySQL mais pas pour MS-SQL.
SQLSTATE[IMSSP]: The DSN string ended unexpectedly
[modifier | modifier le wikicode]Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : les virgules et points-virgules changent d'un pilote à l'autre.
SQLSTATE[IMSSP]: This extension requires the Microsoft SQL Server 2012 Native Client ODBC Driver to communicate with SQL Server
[modifier | modifier le wikicode]Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : utiliser la syntaxe ODBC.
Notice
[modifier | modifier le wikicode]Undefined property
[modifier | modifier le wikicode]La propriété de la variable n'est pas déclarée.
Undefined index: SERVER_NAME in ...php
[modifier | modifier le wikicode]Certaines versions de PHP utilisent $_SERVER['HTTP_HOST']
au lieu de $_SERVER['SERVER_NAME']
.
Undefined variable
[modifier | modifier le wikicode]La variable n'est pas déclarée.
Use of undefined constant
[modifier | modifier le wikicode]La constante n'est pas déclarée.
Parse error
[modifier | modifier le wikicode]syntax error, unexpected '(', expecting variable (T_VARIABLE) or '$' in...
[modifier | modifier le wikicode]Séparer le $ dans la chaine (ex : {$
-> { $
).
syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)
[modifier | modifier le wikicode]Remplacer les variables incluses dans des chaines. Ex :
$query="select $contact['member']"; // pas bien
$query="select ".$contact['member']; // bien
syntax error, unexpected '$Variable' (T_VARIABLE), expecting function (T_FUNCTION)
[modifier | modifier le wikicode]Dans une classe en dehors des méthodes, il faut déclarer les variables avec leur portée :
private $Variable;
Strict Standards
[modifier | modifier le wikicode]Declaration of extFunctions::logs() should be compatible with functions::logs($chaine)
[modifier | modifier le wikicode]La fonction (logs()
dans l'exemple) existe déjà, peut-être avec des majuscules (peu importe les arguments).
Only variables should be passed by reference
[modifier | modifier le wikicode]Il faut appliquer la fonction end()
sur une variable au lieu du résultat d'une opération[8]. Ex :
// $extension = end(explode('.', $fichier));
$ext = explode('.', $fichier);
$extension = end($ext);
Warning
[modifier | modifier le wikicode]Cannot use a scalar value as an array
[modifier | modifier le wikicode]Un tableau de valeurs ne peut pas être redéfini en tableau de tableaux si elles existent. Remplacer les cas ainsi :
$tab['1'] = 1;
//$tab['1']['un'] = 'un';
$tab['un']['un'] = 'un';
Creating default object from empty value
[modifier | modifier le wikicode]Se produit quand on appelle l'attribut d'un objet NULL.
date_diff() expects parameter 1 to be DateTimeInterface
[modifier | modifier le wikicode]La classe native DateTime()
est plus pratique que la fonction date_diff()
:
$Avant = new DateTime('20140101');
$Apres = new DateTime();
print $Avant->diff($Apres)->format("%d");
Illegal string offset
[modifier | modifier le wikicode]On invoque une entrée inexistante dans un tableau associatif. Lever l'exception avec Try
ou if (!isset(
.
mkdir(): File exists
[modifier | modifier le wikicode]Sous Docker Desktop pour Windows, mkdir() appelle file_exists(), et ce dernier renvoie true si le dossier a existé.
PHP Startup: Unable to load dynamic library 'memcached.so'
[modifier | modifier le wikicode]sudo pecl install memcached
Si cela persiste :
sudo apt-get install php-igbinary sudo apt-get install php-msgpack sudo service php7.2-fpm reload
PHP Startup: Unable to load dynamic library 'redis.so'
[modifier | modifier le wikicode]sudo pecl install redis
Erreurs SMTP
[modifier | modifier le wikicode]La connexion a échoué
[modifier | modifier le wikicode]Vérifier le serveur HTTP qui interprète le .php.
SMTP Error: Could not connect to SMTP host
[modifier | modifier le wikicode]Changer de SMTP, ex : http://www.commentcamarche.net/faq/893-parametres-de-serveurs-pop-imap-et-smtp-des-principaux-fai
Si les mails partent sans arriver
[modifier | modifier le wikicode]- Vérifier que l'IP de l'expéditeur n'est pas blacklistée : http://whatismyipaddress.com/blacklist-check
- Définir un reverse DNS si absent
- Veiller à ce que le mail ne soit pas présumé spam, en évitant les sujets vides par exemple, ou les pièces jointes exécutables non compressées (.exe, .cmd, .vbs...).
Composer
[modifier | modifier le wikicode]1 package has known vulnerabilities
[modifier | modifier le wikicode]Exemple avec un guzzlehttp/guzzle (7.4.3)
absent du composer.json :
composer depends guzzlehttp/guzzle
puis composer update
du résultat.
Si cela ne suffit pas, installer Guzzle puis le désinstaller pour mettre à jour sa dépendance indirecte :
composer require guzzlehttp/guzzle && composer remove guzzlehttp/guzzle
"./composer.json" does not contain valid JSON
[modifier | modifier le wikicode]Lors d'un composer install, si ce message survient à tort, c'est qu'un autre fichier .json du projet contient le problème.
Si cela persiste malgré la correction, il se peut qu'il faille redémarrer Docker Desktop sur Windows.
Conclusion: don't install xxx
[modifier | modifier le wikicode]Lors d'un composer require, spécifier une version inférieure du paquet requis.
No driver found to handle VCS repository
[modifier | modifier le wikicode]VCS fonctionne en protocole git, vérifier que l'URL est bien au format "git@repo:bundle.git".
Sinon il y a deux alternatives :
- Pour HTTPS, remplacer la dépendance de type "vcs" par une de type "package"[9].
- Pour décompresser un .zip, utiliser le type "artifact".
no matching package found
[modifier | modifier le wikicode]Ajouter le paramètre suivant :
composer require mon_paquet --update-with-all-dependencies
Permission denied (public key)
[modifier | modifier le wikicode]Si le dépôt privé se clone bien sans passer par "composer" : voir la page Programmation PHP/Composer.
You must be using the interactive console to authenticate
[modifier | modifier le wikicode]Pour installer cette bibliothèque, il faut que Composer puisse se loguer. Pour ce faire, il utilise auth.json qui peut se trouver dans[10] :
$HOME/.composer/auth.json
- ou à côté du
composer.json
Exemple de auth.json[11] :
{
"github-oauth": {
"github.com": "<snip>"
},
"http-basic": {
"repo.magento.com": {
"username": "<snip>",
"password": "<snip>"
}
}
}
Your Composer dependencies require a PHP version ">= 8.0.0".
[modifier | modifier le wikicode]Ajouter au paragraphe "config" :
"platform-check": false
Puis relancer composer install
pour que cela soit pris en compte.
Your requirements could not be resolved to an installable set of packages
[modifier | modifier le wikicode]Si deux dépendances s'empêchent mutuellement de se mettre à jour, les demander dans la même commande :
composer require mon-bundle ^1.0 symfony/http-client 5.3.* -W
Timeout sur composer install
[modifier | modifier le wikicode]Désactiver Xdebug et relancer.
PHPUnit
[modifier | modifier le wikicode]Les tests ne se lancent pas
[modifier | modifier le wikicode]Si phpunit.xml.dist utiliser un bootstrap.php, y ajouter error_reporting(E_ALL);
.
Sinon, si un var_dump() fonctionne dans le setUp() du test unitaire mais pas dans ses méthodes de test, c'est peut-être une exception qui se lance dans un trait ou dans le vendor PHPUnit. Pour la trouver, lancer l'application et regarder les logs (par exemple depuis un contrôleur).
Sinon, si ça fonctionne en commentant le "extends", tester la classe mère pour y trouver l'exception.
Sinon, dans Symfony, tail var/log/test/mon_log.log
.
Sinon, lancer Xdebug pour comprendre.
et echo() ou var_dump() dans les tests n'affiche rien
[modifier | modifier le wikicode]Lancer le test en mode le plus verbeux :
- Avec le paramètre : -vvv
- Modifier phpunit.xml.dist avec :
- <server name="SHELL_VERBOSITY" value="3" />[12]
- <ini name="error_reporting" value="true" />
Les tests fonctionnels renvoient toujours 404
[modifier | modifier le wikicode]Sur Symfony, self::createClient()
appelle directement l'API sans serveur HTTP. Si on utilise phpunit dans symfony/phpunit-bridge, il va chercher sur example.com.
Sinon il manque peut-être un trailing slash dans la route appelée.
Les tests se lancent mais s'arrêtent sans explication, en renvoyant "killed"
[modifier | modifier le wikicode]Un var_dump() sature la mémoire.
Did you forget a "use" statement for MaClasse ou Class 'MaClasse' not found
[modifier | modifier le wikicode]Si des classes existent mais que PHPUnit n'arrive pas à les charger :
- Vérifier les namespaces racines définis dans composer.json par autoload et autoload-dev.
- Retirer suffix=".php" du phpunit.xml utilisé.
The .git directory is missing from...
[modifier | modifier le wikicode]Supprimer vendor/ et relancer composer.
THE ERROR HANDLER HAS CHANGED!
[modifier | modifier le wikicode]Plusieurs solutions possibles :
- phpunit --self-update
- Dans Symfony, changer phpunit.xml.dist avec SYMFONY_DEPRECATIONS_HELPER = weak_vendors
- set_error_handler(array(&$this, 'handleGeoError'));
- Si le projet Symfony a Sentry, on peut le retirer des tests dans bundles.php.
Trying to configure method "get" which cannot be configured because it does not exist, has not been specified, is final, or is static
[modifier | modifier le wikicode]Un mock ne récupère aucune méthode de sa classe car elle n'a pas pu être instanciée.
- La casse du nom de la classe ou du namespace de son
use
n'est probablement pas exacte. - Sinon c'est la portée de la méthode mockée qui n'a pas publique. Si un dump du mock montre les attributs mais pas les méthodes, remplacer
->getMockForAbstractClass()
par->getMock()
. - S'il s'agit d'une méthode finale, il faut la définir lors de l'instanciation du mock. Ex :
$this->serializerMock = $this
->getMockBuilder(SerializerInterface::class)
->setMethods(['serialize', 'deserialize', 'decode'])
->getMock()
;
$this->serializerMock
->method('decode')
->willReturn('')
;
Trying to @cover or @use not existing method
[modifier | modifier le wikicode]Si la méthode existe bien, c'est que la classe testée n'a pas été définie en annotation (avec son namespace) :
/**
* @coversDefaultClass App\Service\MyService
*/
class MyServiceTest extends TestCase
{
...
}
TypeError: Argument 1 passed to PHPUnit\Framework\TestCase::registerMockObjectsFromTestArguments() must be of the type array, null given
[modifier | modifier le wikicode]Si cela survient dans tous les tests qui invoquent un trait, retirer le constructeur de ce trait.
Warning No tests found in class "Xxx".
[modifier | modifier le wikicode]Si les méthodes de tests contiennent des assertions invisibles de PHPUnit, leur ajouter /** @test */
pour afficher pourquoi ils ne se lancent pas. Par exemple, il peut s'agir d'un mock qui demande un constructeur.
Si c'est normal de ne pas lancer de test dans une classe mère, la rendre abstraite ou statique.
Symfony
[modifier | modifier le wikicode]En cas d'erreur, un composant de débogage appelé "Profiler", est accessible en bas à gauche de la page d'erreur, avec des logs et mesures de performances. Installation :
composer require --dev symfony/profiler-pack
On peut par exemple accéder au phpinfo() via l'URL .../_profiler/phpinfo.
Le profiler fonctionne pour les contrôleurs mais pas pour les commandes.
La première soumission d'un formulaire ne marche pas, mais les suivantes oui
[modifier | modifier le wikicode]Retirer le :
$uow = $em->getUnitOfWork(); $uow->computeChangeSets();
Le contrôle de formulaire avec name=‘xxx’ ne peut recevoir le focus.
[modifier | modifier le wikicode]Il s'agit généralement d'un champ caché : le passer en required=false ou faire en sorte qu'il soit toujours rempli même caché.
Un champ de formulaire ChoiceType n'affiche pas sa valeur par défaut, qui est pourtant dans la liste
[modifier | modifier le wikicode]La liste contient une clé d'un type different. Exemple de solution :
'data' => (string) $myInteger,
Une route de contrôleur fonctionne dans un client HTTP mais pas dans un autre
[modifier | modifier le wikicode]Si $request est vide avec certains clients HTTP :
- Utiliser HTTPS au lieu de HTTP.
- Vérifier les paramètres d'en-tête HTTP (Accept: 'application/json' et Content-Type: 'application/json').
- Utiliser $request->getContent() ou ou $request->toArray() au lieu de $request->request[13] (ça ne marche pas à la place de $request->query).
Une route de contrôleur fonctionne dans un client HTTP mais pas en PhpUnit, ex : No matching accepted Response format could be determined (406 Not Acceptable)
[modifier | modifier le wikicode]composer remove friendsofsymfony/rest-bundle
Attempted to load class "WebProfilerBundle" from namespace "Symfony\Bundle\WebProfilerBundle"
[modifier | modifier le wikicode]Si cela fonctionne avec "composer install" mais pas avec " composer install --no-dev", il faut définir APP_ENV=prod
dans le .env.
Attribute "autowire" on service "xxx" cannot be inherited from "_defaults" when a "parent" is set. Move your child definitions to a separate file or define this attribute explicitly.
[modifier | modifier le wikicode]Lors d'utilisation de service abstrait, on ne peut pas utiliser l'autowiring. On peut alors transformer ce service abstrait en dépendance à injecter plutôt qu'à hériter.
Cannot autowire service... alors qu'il existe
[modifier | modifier le wikicode]Peut se produire :
- quand le dossier de la classe est dans "App\.exclude" du services.yaml.
- quand il n'est pas exclus et qu'on le déclare dans un .yaml importé dans services.yaml (donc en doublon de l'autowiring). Il faut alors soit le désactiver, soit exclure les namespaces concernés, soit déplacer ces déclarations dans services.yaml.
- dans un bundle, si
$loader->load('services.yaml');
est bien effectué[14], alors le déclarer dans le services.yaml du bundle. Sinon, vérifier qu'il n'y a pas un chemin erroné dans l'extension prepend(). - Depuis Symfony 6.1 on peut utiliser l'attribut
#[Autowire]
[15].
#[AsEventListener(event: KernelEvents::CONTROLLER)]
class MyListener
{
public function __construct(
private readonly Security $security, // exemple
private readonly ControllerResolverInterface $controllerResolver
) {
}
}
L'erreur est :
Cannot autowire service "App\EventListener\MyListener": argument "$controllerResolver" of method "__construct()" references interface "Symfony\Component\HttpKernel\Controller\ControllerResolverInterface" but no such service exists. You should maybe alias this interface to one of these existing services: "debug.controller_resolver", "debug.controller_resolver.inner".
La solution est d'écrire :
#[AsEventListener(event: KernelEvents::CONTROLLER)]
class MyListener
{
public function __construct(
private readonly Security $security, // exemple
#[Autowire(service: 'controller_resolver')] private readonly ControllerResolverInterface $controllerResolver
) {
}
}
Cannot load resource "../../src/Controller/". Make sure to use PHP 8+ or that annotations are installed and enabled.
[modifier | modifier le wikicode] composer require sensio/framework-extra-bundle
Circular reference detected
[modifier | modifier le wikicode]L'autoloader se heurte à un argument du constructeur d'une classe : il faut le sortir de la méthode __construct()
pour le définir dans une méthode portant son nom. Exemple de déclaration en YAML :
app.ma_classe:
class: App\MaClasse
arguments:
- '@service.sans.probleme'
calls:
- method: setServiceAvecProbleme
arguments:
- '@service.avec.probleme'
tags:
- { name: doctrine.event_subscriber }
A circular reference has been detected when serializing the object
[modifier | modifier le wikicode]Idem en fetch="EXTRA_LAZY"
dans l'entité.
Pour résoudre cela sans changer de relation entre les entités, il y a plusieurs solutions :
- Dans l'entité,
use Symfony\Component\Serializer\Annotation\Ignore;
et annotation/** @Ignore() */
au dessus de l'attribut en erreur. - Dans le contrôleur, éviter de renvoyer la réponse brute, mais filtrer les attributs avec
use Symfony\Component\Serializer\SerializerInterface;
et$this->serializer->serialize($data, 'json', $context)
.
curl error 6 while downloading https://flex.symfony.com/versions.json: Could not resolve host: flex.symfony.com
[modifier | modifier le wikicode]composer update symfony/flex --no-plugins --no-scripts
CURLPIPE_HTTP1 is no longer supported
[modifier | modifier le wikicode]Si cela se produit sur un projet Symfony avec composer, il faut juste :
composer global require symfony/flex ^1.5
rm -Rf vendor/symfony/flex
Environment variables "xxx" are never used. Please, check your container's configuration.
[modifier | modifier le wikicode]Pazsser par des variables intermédiaires dans services.yaml :
yyy: '%env(xxx)%'
Error 400 Bad Request Your browser sent a request that this server could not understand.
[modifier | modifier le wikicode]Les règles de réécriture d'URL Apache sont erronées (voir ci-dessous).
Error 404 Not Found The requested URL /xxx was not found on this server.
[modifier | modifier le wikicode]Si la page d'accueil fonctionne mais pas les sous-pages (alors qu'un nom de domaine est déjà dédié au site dans le vhost), les règles de réécriture d'URL de la configuration Apache sont manquantes ou erronées. Il faut donc créer public/.htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
Invalid header: CR/LF/NUL found
[modifier | modifier le wikicode]Un JSON envoyé en POST dans symfony/http-client contient des retours chariots inattendus : les retirer. Ex :
$json = preg_replace("(\r?\n)", '', $json);
manifest.json does not exist
[modifier | modifier le wikicode]yarn install && yarn add --dev @symfony/webpack-encore && yarn build
Maximum function nesting level of '6000' reached
[modifier | modifier le wikicode]Si cela se produit par exemple en vidant le cache, c'est que deux services se renvoient la balle (même indirectement) depuis leurs constructeurs.
NetworkError when attempting to fetch resource (Firefox) / Failed to fetch (Chrome)
[modifier | modifier le wikicode]Dans l'API avec Swagger UI : violation du CQRS empêchant l'affichage du résultat de l'API dans /api/doc, à causes des domaines. Sur un domaine local, cela peut être résolu en changeant l'URL avant /api/doc pour qu'elle soit valide (ex : passer de wikibooks/api/doc à wikibooks.org/api/doc).
Sinon réessayer en HTTP au lieu de HTTPS.
Sinon c'est la clé renseignée (du .env) qui est différente de celle en BDD.
Si le serveur Web est Nginx, retirer du vhost "add_header Access-Control-Allow-Origin *;" et "limit_exept".
request->request et request->query sont vides à tort
[modifier | modifier le wikicode]Utiliser $request->getContent() ou $request->toArray() à la place[16].
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
[modifier | modifier le wikicode]Un service inexistant ou avec des paramètres en erreur est appelé. Cela peut être provoqué par une variable d'environnement d'URL manquante ou erronée (ex : retirer le protocole, ou ajouter la version du SGBD).
SSL certificate problem: unable to get local issuer certificate
[modifier | modifier le wikicode]Utiliser l'installation avec "Composer.phar" plutôt que "Symfony.phar".
InvalidArgumentException Invalid env(bool:xxx) name: only "word" characters are allowed
[modifier | modifier le wikicode]Soit retirer la résolution "bool:" sur la variable d'environnement concernée, soit la renommer si elle contient des symboles autres que des lettres, des nombres ou underscore (ex : "=", "%", ":", etc.).
The autoloader expected class "App\MaClasse" to be defined in file "/var/www/.../MaClasse.php". The file was found but the class was not in it, the class name or namespace probably has a typo.
[modifier | modifier le wikicode]Revérifier que :
- le fichier a bien l'extension .php
- la balise ouvrante
<?php
- comporte bien la classe du même nom à la majuscule prêt
- avec le bon namespace et qui correspond aux dossiers (vérifiable dans la déclaration avec CTRL + clic dans PhpStorm).
Uncaught ReflectionException
[modifier | modifier le wikicode]Si c'est lors du passage de PHP 7 à 8, essayer de lancer le script sans Symfony pour avoir le détail (ex : utiliser PhpUnit directement au lieu de PhpUnit bridge). Cela peut par exemple provenir de return type différents entre une interface (ex : ArrayAccess) et son implémentation.
You have requested a non-existent parameter "kernel.secret". Did you mean this: "kernel.charset"?
[modifier | modifier le wikicode]À l'installation d'une dépendance, si les champs sont renseignés dans config/packages, alors c'est qu'ils ne sont pas chargé dans le bundle par Kernel.php.
Peut se traduire aussi par des erreurs de chargement de bundle du type : The child config "x" under "y" must be configured.
"The controller for URI \"/api/ma_route/123\" is not callable: Controller \"MonController\" does neither exist a service nor as class."
[modifier | modifier le wikicode]Si bin/console debug:autowiring --all
montre le service et bin/console debug:route
la route, renseigner routes.yaml et vider le cache. Ex :
index:
methods: DELETE
path: /api/ma_route/{id}
controller: App\Controller\MonController::__invoke
Si ça ne fonctionne pas, passer par un évènement sur la méthode générique.
Doctrine
[modifier | modifier le wikicode]Le champ ne se sauvegarder pas en base
[modifier | modifier le wikicode]- Est-ce qu'il y a le flush après la modification du champ ?
- Le cache Doctrine a-t-il bien été vidé depuis l'ajout du champ ?
- Est-il bien dans la variable, sinon est-il mappé dans un formulaire ?
- Est-il en annotation PHP alors que Symfony est configuré pour les attributs ?
Le champ sauvegardé en base est toujours 0
[modifier | modifier le wikicode]Se produit quand on utilise l'annotation @ORM\GeneratedValue(strategy="IDENTITY")
sur un champ qui n'est pas AUTOINCREMENT en base de données.
Binding an entity with a composite primary key to a query is not supported
[modifier | modifier le wikicode]Se produit quand on utilise la méthode magique find() d'un repository sur une entité qui a une clé composite (au moins deux attributs avec @ORM\Id
). Il faut alors utiliser findBy(['id' => xxx])
.
Call to undefined function Closure at EventDispatcher.php:299
[modifier | modifier le wikicode]Ajouter dans composer.json :
"conflict": {
"symfony/symfony": "*",
"doctrine/common": ">=3.0",
"doctrine/persistence": "<1.3"
},
Puis lancer "composer update".
Cannot autowire service "App\Components\CRM\Repository\MonRepository": argument "$class" of method "Doctrine\ORM\EntityRepository::__construct()" references class "Doctrine\ORM\Mapping\ClassMetadata" but no such service exists.
[modifier | modifier le wikicode]Se produit avec l'autowiring, quand on ajoute l'annotation vers un repo dans une entité. Ex :
@ORM\Entity(repositoryClass="App\MonRepository")
En fait depuis Doctrine 1.8[17], le repository doit étendre "ServiceEntityRepository" au lieu de "EntityRepository", et avoir un constructeur. Par exemple :
use App\Entity\MonEntite;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\ManagerRegistry; // anciennement Doctrine\Persistence\ManagerRegistry;
class MonEntiteRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, MonEntite::class);
}
Cannot select entity through identification variables without choosing at least one root entity alias
[modifier | modifier le wikicode]Retirer les ->addSelect()
du queryBuilder, ou utiliser ->from()
.
Class "App\Entity\X" seems not to be a managed Doctrine entity. Did you forget to map it?
[modifier | modifier le wikicode]On fait appel à une classe PHP comme si c'était une entité Doctrine : il faut simplement ajouter les annotations Doctrine à la classe, ou bien recréer la table à partir du code PHP.
Column not found: 1054 Unknown column 't0.xxx_id' in 'field list'
[modifier | modifier le wikicode]Il faut juse ajouter la colonne de jointure sous l'annotation *To*. Ex :
@ORM\JoinColumn(name="id", referencedColumnName="id_personne")
Could not find the entity manager for class '...'
[modifier | modifier le wikicode]Dans doctrine.yaml, retirer type: annotation
.
Entity has to be managed or scheduled for removal for single computation
[modifier | modifier le wikicode]- Si remove : retirer le ON CASCADE DELETE de l’entité supprimée.
- Si update : faire le add avant.
Entity of type 'App\\MonEntite' for IDs id(1) was not found
[modifier | modifier le wikicode]S'il s'agit de l'ID d'une entité jointe, le rendre nullable (@ORM\JoinColumn(nullable=true)
)[18].
S'il s'agit d'une entité dont la clé primaire est une clé étrangère, lui ajouter :
@ORM\GeneratedValue(strategy="NONE")
Entity of type App\\MonEntite is missing an assigned ID for field 'id'.
[modifier | modifier le wikicode]Une entité n'arrive pas à être sauvegardée avec un ID null (non auto-incrémenté). Il faut donc le générer (par exemple avec un new UuidV4()
).
Sinon vérifier que l'erreur ne vient pas d'un listener en sur Doctrine\ORM\Events::prePersist
qui tente de persister l'entité récupérée via $eventArgs->getEntity()
.
Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship 'X' that was not configured to cascade persist operations for entity: X. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"})
[modifier | modifier le wikicode]Un service a un tag et un argument constructeur incompatible. Ce service en argument fait un $em->clear() au lieu de clear(object), ou persist(object) au lieu de merge(object).
Invalid PathExpression. Must be a StateFieldPathExpression
[modifier | modifier le wikicode]Cela peut arriver quand on ajoute une clé étrangère dans un select sans sa jointure :
$this->createQueryBuilder('user') ->select(['user.id', 'user.company'])
On peut donc le remplacer par :
$this->createQueryBuilder('user') ->select('user.id') ->leftJoin('user.company', 'u')
Par contre, si on ne veut pas la jointure, utiliser "identity" :
$this->createQueryBuilder('user') ->select(['user.id', 'identity(user.company) company'])
Multiple non-persisted new entities were found through the given association graph:\n\n * A new entity was found through the relationship 'X' that was not configured to cascade persist operations for entity: Y. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={\"persist\"}). / Notice: Undefined index: 00000000...
[modifier | modifier le wikicode]- Ajouter un persist dans l'entité ou avant le flush.
- Sinon, on tente de flusher une entité récupérée, ou dont une de ses entités liées a été récupérée, par l’entityManager de la BDD slave. Utiliser le master à la place.
- Sinon c'est que le même flush est réalisé plusieurs fois : ajouter du cache d'instance pour ne pas ré-exécuter ce code.
No alias was set before invoking getRootAlias()
[modifier | modifier le wikicode]Se produit soit :
- Lors d'un
$qb = $this->entityManager->getEntityManager()->createQueryBuilder();
(sans alias comme dans :$this->createQueryBuilder('me')
hérité deEntityRepository
).
Il faut alors rajouter un alias pour l'entité courante ainsi :
$em->createQueryBuilder() ->select('me') ->from(MonEntite::class, 'me')
- Ou pour un update où on répète à tort l'alias ('me') dans
update()
(ce qui peut aussi donnerError: Class 'pn' is not defined
quand il n'y a pas de jointure) :
$this->createQueryBuilder('me') ->update() ->set('me.isDeleted', 1)
Property \"metadata\" on resource \"App\\MonEntite\" is declared as a subresource, but its type could not be determined in
[modifier | modifier le wikicode]Survient quand une entité étend une autre sans discriminator[19].
The association mon_entité1#entité2 refers to the owning side field mon_entité2#id which does not exist
[modifier | modifier le wikicode]Si l'entité 2 ne fait pas référence à l'entité 1, supprimer dans l'entité 1, champ entité2, le mappedBy=
.
The class 'Doctrine\Common\Collections\ArrayCollection' was not found in the chain configured namespaces App\Entity
[modifier | modifier le wikicode]Il peut y avoir une entité avec une relation ManyToMany dans laquelle on met un ArrayCollection au lieu de l'entité demandée[20].
Sinon vérifier qu'on attend pas un PersistentCollection au lieu d'un ArrayCollection (ou vice-versa avec ->unwrap()).
The EntityManager is closed
[modifier | modifier le wikicode]Cela survient quand l'EntityManager rencontre une exception. On peut[21] :
- la lever avec :
if ($this->em->isOpen()) {
$this->em->persist($entity);
$this->em->flush($entity);
}
- recréer l'entityManager :
if (!$this->em->isOpen()) {
$this->em = $this->em->create(
$this->em->getConnection(),
$this->em->getConfiguration()
);
}
The identifier id is missing for a query
[modifier | modifier le wikicode]Se produit lors d'un repository->find(null).
The metadata storage is not up to date, please run the sync-metadata-storage command to fix this issue
[modifier | modifier le wikicode]Si le paramètre "server_version" est présent dans le DSN "DATABASE_URL", l'ajouter, sinon le retirer.
The referenced column name 'xxx' has to be a primary key column on the target entity class
[modifier | modifier le wikicode]S'il n'est pas possible d'utiliser la clé étrangère comme clé primaire, retirer simplement la ligne :
#[ORM\JoinColumn(name: 'my_id', referencedColumnName: 'my_id')]
The table with name 'xxx' already exists
[modifier | modifier le wikicode]Si cela survient lors du bin/console doctrine:schema:validate
, create ou update sur une base vide, et qu'il n'y a pas de doublon dans le dossier "Entity"[22] :
- Chercher les doublons dans d'autres namespaces.
- Forcer la version du SGBD dans
DATABASE_URL
, en l'ajoutant dans?serverVersion=
. - Dans le cas du validate, on peut ajouter
--skip-sync
pour bypasser cette partie du test.
Transaction commit failed because the transaction has been marked for rollback only
[modifier | modifier le wikicode]Se produit quand un flush() rencontre une erreur SQLSTATE (ex : colonne manquante, même d'une autre table). Le commenter pour la voir apparaitre.
Uncaught PHP Exception Doctrine\Common\Proxy\Exception\UnexpectedValueException: "Your proxy directory "var/cache/prod/doctrine/orm/Proxies" must be writable"
[modifier | modifier le wikicode]Si cela se produit avec APP_ENV=prod
et pas dev
dans le .env :
rm -Rf var/cache/ var/log
Uncaught Symfony\Component\Debug\Exception\UndefinedFunctionException: Attempted to call function "apc_fetch"
[modifier | modifier le wikicode] sudo pecl install apcu
sudo pecl install apcu_bc
sudo apt-get install -y php7.2-apcu php7.2-apcu-bc
Unexpected non-iterable value for to-many relation
[modifier | modifier le wikicode]Modifier la déclaration du champ en erreur avec un itérable. Ex :
public $mesObjets = new ArrayCollection();
S'il n'y a pas de champ en erreur, il faut le retrouver avec dd($type)
dans AbstractItemNormalizer.
Unknown database
[modifier | modifier le wikicode]Lancer doctrine:database:create :
bin/console d:d:c
Puis rajouter les éventuelles tables :
bin/console doctrine:schema:update --force
Unrecognized field (ORMException)
[modifier | modifier le wikicode]Se produit quand un findBy de repository ne trouve pas un champ de son entité. Cela peut être résolu avec :
bin/console cache:clear
- Vérifier si on ne recherche pas à tort une valeur sans sa clé (si Unrecognized field: 0).
- Passer par un QueryBuilder plutôt que par un find.
- Ne pas faire hériter le repo de ServiceEntityRepository.
WARNING [cache] Failed to save key... "cache-adapter" => "Symfony\Component\Cache\Adapter\ApcuAdapter"
[modifier | modifier le wikicode]Ajouter apc.enable_cli=1
dans php.ini.
DoctrineMigrations
[modifier | modifier le wikicode]S'il n'exécute pas tout (sans logs même en -vvv)
[modifier | modifier le wikicode]Séparer en plusieurs migrations, notamment les créations de tables et de fonctions.
The schema provider is not available
[modifier | modifier le wikicode]Remplacer "connection" par "em" dans doctrine_migrations.yaml :
doctrine_migrations:
em: default
Syntax error or access violation
[modifier | modifier le wikicode]Il faut probablement échapper des caractères, par exemple avec la syntaxe heredoc ou $this->connection->quote().
API Platform
[modifier | modifier le wikicode]Invalid IRI
[modifier | modifier le wikicode]Ajouter le getId() dans l'entité récupérée par IRI.
InvalidArgumentException: "No item route associated with the type xxx
[modifier | modifier le wikicode]Se produit quand on a pas une route POST sans route GET[23], ou si le GET n'a pas d'ID pour créer des URI. Il faut donc en créer une, mais pas forcément besoin de créer un contrôleur :
* @ApiResource(
* itemOperations={
* "get"={
* "method"="GET",
* "controller"=NotFoundAction::class,
* "read"=false,
* "output"=false,
* },
* },
* )
No identifiers defined for resource of type
[modifier | modifier le wikicode] /**
* @ApiProperty(identifier=true)
*/
private $id;
Si aucun ID n'est possible, en renvoyer "1" par exemple.
Unable to generate an IRI for
[modifier | modifier le wikicode]En général, rajouter un getId() dans l'entité.
The total number of joined relations has exceeded the specified maximum. Raise the limit if necessary with the \"api_platform.eager_loading.max_joins\" configuration key, or limit the maximum serialization depth using the \"enable_max_depth\" option of the Symfony serializer
[modifier | modifier le wikicode]Sur MySQL (ou MariaDB) il existe un maximum de 64 jointures. Donc s'il n'est pas possible d'augmenter max_joins, il faut limiter les jointures par les deux annotations suivantes :
* @API\ApiSubresource(maxDepth=1)
* @ORM\OneToMany(targetEntity="MonEntité", mappedBy="monChamp", fetch="EXTRA_LAZY")
Twig
[modifier | modifier le wikicode]Un template Twig ne se rafraichit pas dans la navigateur
[modifier | modifier le wikicode]En local, dans .env, passer de APP_ENV=prod
à APP_ENV=dev
.
Sinon vider le cache Symfony.
A hash key must be followed by a colon (:)
[modifier | modifier le wikicode]Il faut probablement mettre des parenthèses autour des variables dans un merge de tableau. Ex :
myArray|merge([{(myKey): (myValue)}])
Array to string conversion
[modifier | modifier le wikicode]Plusieurs solutions sont possibles pour afficher un tableau dans un template JSON.
- Pour avoir un tableau, ajouter (et retirer les guillemets autour de la valeur si besoin) :
"my_key": {{ my_value |json_encode(constant('JSON_PRETTY_PRINT'))|raw }},
voire :
"my_key": {{ my_value |join(', ') }},
- Pour avoir un objet en chaine de caractères, faire le json_encode en amont puis laisser les guillemets :
"my_key": "{{ my_value }}",
double quoted property
[modifier | modifier le wikicode]Une virgule de trop après une clé.
key \"id\" for array with keys \"0\" does not exist.
[modifier | modifier le wikicode]Appel d'une clé absente d'un tableau.
The CSRF token is invalid. Please try to resubmit the form
[modifier | modifier le wikicode]Dans le formulaire concerné, ajouter la ligne :
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
...
'csrf_protection' => false,
]);
}
unexpected token "punctuation" of value "{"
[modifier | modifier le wikicode]Au choix :
- Ajouter les apostrophes aux clés du tableau concerné.
- Ajouter des parenthèses à ses expressions.
- Remplacer les accolades par des crochets pour le premier niveau.
xmlParseEntityRef: no name
[modifier | modifier le wikicode]Un "&" n'est pas échappé en XML. Il faut ajouter un filtre "| escape" en Twig pour le faire.
PhpStorm
[modifier | modifier le wikicode]Les logs sont accessibles par :
tail -f ~/.PhpStorm2019.2/system/log/idea.log
Certains dossiers sont rouges (exclus) dans la navigation et l'indexation, alors qu'ils ne sont pas censés l'être
[modifier | modifier le wikicode]Fermer le projet, supprimer le .idea, et le rouvrir.
Impossible de CTRL + clic dans un .twig (chemin introuvable)
[modifier | modifier le wikicode]Vérifier que le plugin Symfony de PhpStorm est bien installé et activé.
Si cela persiste, dans File\Settings\PHP\Symfony\Twig \ Template, ajouter le chemin vers les .twig importés du bundle concerné.
L'historique Git d'un dossier est tronqué
[modifier | modifier le wikicode]Si git log .
montre plus de commits que le clic droit / Git / Show history, alors cliquer sur Files / Invalidate Caches, et tout cocher.
Si cela ne fonctionne pas après redémarrage, et que le projet fait partie d'un groupe de projets ouverts, le fermer (clic droit dessus et "Remove from project view"), puis le rouvrir.
Dans l'onglet Git, on ne voit pas la liste des fichiers modifiés
[modifier | modifier le wikicode]Dans Settings, Version Control, Commit, décocher "Use non-modal commit interface".
Un fichier a disparu des onglets, a un icône de point d'interrogation, et ne peut être rouvert
[modifier | modifier le wikicode]Il n'est pas ou plus associé à un type de fichier, aller dans File\Associate with File Type.
incoming connection from xdebug
[modifier | modifier le wikicode]Lors d'une erreur au remplissage de cette pop-up, on peut la corriger dans .idea/workspace.xml.
No differences files that files have differences only in line separators
[modifier | modifier le wikicode]Les scripts lancés depuis PhpStorm sous Windows modifient les retours à la ligne (CLRF to LF).
Changer l'option dans Settings/Preferences | Editor | Code Style | Line separator[24] vers "System dependent".
Sinon, configurer git :
git config --global core.autocrlf true
Undefined class xxx
[modifier | modifier le wikicode]Une classe existe mais PhpStorm ne la voit pas : ajouter son dossier dans File\Settings\Directories, retirer l'exclusion (rouge) du dossier concerné.
Xdebug
[modifier | modifier le wikicode]Des logs Xdebug sont ajoutables dans php.ini :
xdebug.remote_log = /var/www/xdebug.log
xdebug.show_error_trace = 1
; Profiling (enable via cookie or GET/POST variable: XDEBUG_PROFILE=1).
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = /tmp/
; var_dump() settings.
xdebug.overload_var_dump = 1
xdebug.cli_color = 1
En CLI, la console s'ouvre sur default_prepend.php et on ne voit pas l'exécution de la commande
[modifier | modifier le wikicode]Cela se produit quand plusieurs projets sont ouverts dans PhpStorm et que la commande n'appartient pas au principal.
Le navigateur déclenche bien le débogage pas à pas, mais on ne voit pas le fichier PHP dans l'IDE
[modifier | modifier le wikicode]Il manque le mapping (par exemple avec les routes du conteneur). Par exemple dans PhpStorm, Servers, cocher "Use path mappings" et le renseigner.
Messages d'erreur
[modifier | modifier le wikicode]Cannot find file '/usr/local/php/php/auto_prepends/default_prepend.php' locally
[modifier | modifier le wikicode]Sous PhpStorm avec Docker, cliquer sous l'erreur pour modifier le path mapping.
Code coverage needs to be enabled in php.ini by setting 'xdebug.mode' to 'coverage'
[modifier | modifier le wikicode]Pour éviter d'éditer le .ini, on peut remplacer :
bin/phpunit --coverage-text
par :
php -dxdebug.mode=coverage bin/phpunit --coverage-text
Could not connect to client
[modifier | modifier le wikicode]Le serveur est introuvable, changer :
- En V2, xdebug.remote_host ou remote_port.
- En V3, xdebug.client_host ou xdebug.client_port.
Gateway Timeout
[modifier | modifier le wikicode]Cette erreur du navigateur généralement due au serveur Web.
- Sur Apache, dans httpd.conf augmenter le nombre de secondes par défaut dans
Timeout 60
[25]. - Sur Nginx, augmenter
fastcgi_read_timeout 60s;
[26]. - Sur IIS, étendre la valeur du paramètre Activity Timeout des FastCGI Settings[27].
- Cela peut aussi provenir d'un load balancer en amont du serveur HTTP.
De plus, on peut aussi revoir les variables du php.ini. Ex :
max_execution_time=30 # 30 s par défaut
max_input_time=-1 # Utilisera "max_execution_time" si -1, sinon la valeur indiquée
Failed to read FastCGI header
[modifier | modifier le wikicode]Si le log Apache affiche cela lors d'un Gateway Timeout, il faut ajouter à httpd.conf[28] :
ProxyTimeout 6000
<IfModule mod_fcgi.c>
FcgidProcessLifeTime 6000
FcgidBusyTimeout 6000
FcgidConnectTimeout 6000
FcgidIdleTimeout 6000
FcgidInitialEnv 6000
FcgidIOTimeout 6000
IdleTimeout 6000
IPCConnectTimeout 6000
IPCCommTimeout 6000
IdleScanInterval 6000
</IfModule>
Parfois il convient aussi de modifier le php.ini[29] :
opcache.optimization_level=0xFFFFFBFF
xdebug.remote_cookie_expire_time=6000
Enfin, sur PhpStorm on rencontre cela dans le cas de sous-requêtes qui dépassent la valeur du paramètre "Max. simultaneous connections".
No code coverage driver is available
[modifier | modifier le wikicode]Installer ou activer Xdebug. Il doit apparaitre ensuite dans php -v
.
Remote file path 'default_prepend.php' is not mapped to any file path in project
[modifier | modifier le wikicode]Sous PhpStorm il faut décocher dans les settings, debug, les deux cases Force break..., puis de redémarrer l'IDE[30].
Time-out connecting to client
[modifier | modifier le wikicode]Changer xdebug.remote_host ou xdebug.remote_port car le serveur existe mais n'écoute pas le port spécifié.
Si le navigateur ne déclenche plus le débogage sur l'IDE, alors que ce dernier écoute et que la clé du navigateur est bien définie, c'est peut-être le pare-feu qui bloque. Exemple de reset sur Linux avec iptables[31] :
iptables --policy INPUT ACCEPT;
iptables --policy OUTPUT ACCEPT;
iptables --policy FORWARD ACCEPT;
iptables -Z; # zero counters
iptables -F; # flush rules
iptables -X; # delete all extra chains
Waiting for incoming connection with ide key 'xxx'
[modifier | modifier le wikicode]Xdebug peut marcher pour certains sites, sauf un qui ne déclenche rien dans l'IDE. Ce message apparait alors dans PhpStorm si on clique sur "Debug".
- Vérifier le serveur et son port) associé à l'URL[32].
- Voir la page Programmation PHP/Xdebug.
GraphQL
[modifier | modifier le wikicode]Fields "maRoute" conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.
[modifier | modifier le wikicode]Si on appelle plusieurs fois la même route dans la même requête, il faut définir des alias. Ex :
mutation {
maRoute(...)
aliasMaRoute: maRoute(...)
}
Le résultat de la requête sera donc un tableau avec ['data' => [[maRoute => ...], [aliasMaRoute => ...]].
Windows
[modifier | modifier le wikicode]imagecreatefromstring(): gd-png: libpng warning: Interlace handling should be turned on when using png_read_image
[modifier | modifier le wikicode]Remplacer le php_gd2.dll du PHP 7.4.33 par celui du 7.4.2 téléchargé depuis https://www.pconlife.com/viewfileinfo/php-gd2-dll/.
Exemple du chemin par défaut :
C:\wamp64\bin\php\php7.4.33\ext\
Références
[modifier | modifier le wikicode]- ↑ http://windows.php.net/download/
- ↑ https://stackoverflow.com/questions/9973555/setting-max-input-vars-php-ini-directive-using-ini-set
- ↑ https://stackoverflow.com/questions/804571/how-to-subtract-two-dates-ignoring-daylight-savings-time-in-php
- ↑ https://stackoverflow.com/questions/31115982/malformed-utf-8-characters-possibly-incorrectly-encoded-in-laravel
- ↑ https://whynhow.info/17522/How-to-get-rid-of-SIGBUS-when-running-php-fpm?
- ↑ https://www.kinamo.fr/fr/support/faq/determiner-le-nombre-de-processes-valide-pour-php-fpm-sur-nginx
- ↑ https://www.php.net/manual/fr/function.fopen.php
- ↑ http://stackoverflow.com/questions/4636166/only-variables-should-be-passed-by-reference
- ↑ https://stackoverflow.com/questions/24443318/getting-error-no-driver-found-to-handle-vcs-repository-on-composer-and-svn?answertab=votes#tab-top
- ↑ https://getcomposer.org/doc/articles/http-basic-authentication.md
- ↑ https://github.com/magento/magento2/issues/2523#issuecomment-159884152
- ↑ https://symfony.com/doc/current/console/verbosity.html
- ↑ https://silex.symfony.com/doc/2.0/cookbook/json_request_body.html
- ↑ https://symfony.com/doc/current/bundles/configuration.html
- ↑ https://symfony.com/doc/current/service_container/autowiring.html
- ↑ https://symfony.com/doc/5.4/components/http_foundation.html
- ↑ https://www.it-swarm.dev/fr/php/service-autowire-impossible-largument-fait-reference-la-classe-mais-ce-service-nexiste-pas/836794307/
- ↑ https://cilefen.github.io/symfony/2016/12/29/doctrine-orm-nulls.html
- ↑ https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/inheritance-mapping.html
- ↑ https://openclassrooms.com/forum/sujet/symfony2-collection-erreur-de-namespace
- ↑ https://www.kerstner.at/2014/09/doctrine-2-exception-entitymanager-closed/
- ↑ https://openclassrooms.com/forum/sujet/doctrine-schema-update-impossible
- ↑ https://github.com/api-platform/core/issues/3501
- ↑ https://stackoverflow.com/questions/40470895/phpstorm-saving-with-linux-line-ending-on-windows
- ↑ https://www.h3xed.com/web-development/php-and-apache-504-gateway-timeout-troubleshooting-and-solutions
- ↑ http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout
- ↑ https://www.leighton.com/blog/php-debugging-in-phpstorm-6-0-with-xdebug/
- ↑ https://support.plesk.com/hc/en-us/articles/115000064929-Website-is-not-accessible-The-timeout-specified-has-expired-Error-dispatching-request-to
- ↑ https://www.reddit.com/r/drupal/comments/ase67i/for_issue_reference_service_unavailable_error/
- ↑ https://www.jetbrains.com/help/phpstorm/troubleshooting-php-debugging.html
- ↑ https://ubuntuforums.org/showthread.php?t=1381516
- ↑ https://stackoverflow.com/questions/17715128/xdebug-phpstorm-waiting-for-incoming-connection-with-ide-key