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 PHPModifier

IIS tourne dans le vide après la mise à jour de PHPModifier

Vérifier que les dépendances sont bien installées (ex : Visual C++)[1].

La connexion a été réinitialiséeModifier

Erreur sous Firefox provenant d'un mysql_close() ou d'une directive Apache.

La page n'est pas redirigée correctementModifier

Un header revient en boucle après une suite de conditions. S'il est local, le remplacer par chdir().

Les dernières lignes d'un INSERT sont ignoréesModifier

Il faut fragmenter en plusieurs insertions, par exemple tous les 300 enregistrements.

Un regex marche sur https://regex101.com/ mais pas en localModifier

Si la machine est Windows, tenir compte de la différence de retour chariot : \r\n au lieu de \n.

PHP natifModifier

Connect Error, 2002: Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée.Modifier

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

Ouvrir les pare-feux.

Invalid body indentation level (expecting an indentation level of at least 8)Modifier

En PHP7.3, la syntaxe heredoc impose de supprimer l'indentation de la balise fermante : elle soit suivre "\n".

This extension requires the Microsoft ODBC Driver 11 for SQL ServerModifier

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 matchModifier

Se procurer une autre DLL à renseigner dans PHP.ini.

You can only iterate a generator by-reference if it declared that it yields by-referenceModifier

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 generatorModifier

Un iterator_to_array($generator) le ferme en le convertissant en tableau.

child exited on signal 7 (SIGBUS)Modifier

Modifier le php.ini[2] :

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[3].

Invalid resource type: unknown typeModifier

Le paramètre n°2 de fopen() ne permet pas la lecture[4].

Each stream must be readableModifier

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 resourceModifier

On essaie de fermer un fichier fermé : utiliser if (is_resource($f)) avant.

Fatal errorModifier

[] operator not supported for stringsModifier

// 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 exhaustedModifier

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");

Call to a member function ... on a non-objectModifier

La méthode est invoquée sur une variable qui n'est pas une classe.


Call to undefined functionModifier

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

Installer le pilote correspondant à la version de PHP du serveur Web :

  1. Télécharger sur https://www.microsoft.com/en-us/download/details.aspx?id=20098.
  2. Copier dans le dossier PHP (ex : C:\Program Files (x86)\EasyPHP\binaries\php\php_runningversion\ext).
  3. Ajouter à PHP.ini.
  4. Redémarrer le serveur Web.

Call to undefined methodModifier

La méthode est invoquée sur une classe qui ne l'a pas.


Cannot access empty propertyModifier

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'utilisateurModifier

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 memoryModifier

Éditer le PHP.ini pour augmenter la ligne :

memory_limit = 256M

pdo_sqlsrv_db_handle_factory: Unknown exception caughtModifier

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

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

Il faut certainement rerégler la Configuration DCOM voire le serveur Web.


Uncaught exception 'PDOException' with messageModifier

could not find driverModifier

Se référer à la liste des pilotes connus dans Programmation PHP/PDO#Installation.

SQLSTATE[HY000]: General errorModifier

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 userModifier

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'utilisateurModifier

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

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 stringModifier

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 unexpectedlyModifier

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 ServerModifier

Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : utiliser la syntaxe ODBC.

NoticeModifier

Undefined propertyModifier

La propriété de la variable n'est pas déclarée.


Undefined index: SERVER_NAME in ...phpModifier

Certaines versions de PHP utilisent $_SERVER['HTTP_HOST'] au lieu de $_SERVER['SERVER_NAME'].

Undefined variableModifier

La variable n'est pas déclarée.

Use of undefined constantModifier

La constante n'est pas déclarée.

Parse errorModifier

syntax error, unexpected '(', expecting variable (T_VARIABLE) or '$' in...Modifier

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

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

Dans une classe en dehors des méthodes, il faut déclarer les variables avec leur portée :

private $Variable;

Strict StandardsModifier

Declaration of extFunctions::logs() should be compatible with functions::logs($chaine)Modifier

La fonction (logs() dans l'exemple) existe déjà, peut-être avec des majuscules (peu importe les arguments).

Only variables should be passed by referenceModifier

Il faut appliquer la fonction end() sur une variable au lieu du résultat d'une opération[5]. Ex :

// $extension = end(explode('.', $fichier));
$ext = explode('.', $fichier);
$extension = end($ext);

WarningModifier

Cannot use a scalar value as an arrayModifier

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 valueModifier

Se produit quand on appelle l'attribut d'un objet NULL.

date_diff() expects parameter 1 to be DateTimeInterfaceModifier

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 offsetModifier

On invoque une entrée inexistante dans un tableau associatif. Lever l'exception avec Try ou if (!isset(.


mkdir(): File existsModifier

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

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

sudo pecl install redis

Erreurs SMTPModifier

La connexion a échouéModifier

Vérifier le serveur HTTP qui interprète le .php.

SMTP Error: Could not connect to SMTP hostModifier

Changer de SMTP, ex : http://www.commentcamarche.net/faq/893-parametres-de-serveurs-pop-imap-et-smtp-des-principaux-fai

SMTP server error: ERR Email ID not foundModifier

Si les mails partent sans arriverModifier

  • 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...).


ComposerModifier

"./composer.json" does not contain valid JSONModifier

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 xxxModifier

Lors d'un composer require, spécifier une version inférieure du paquet requis.

No driver found to handle VCS repositoryModifier

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"[6].
  • Pour décompresser un .zip, utiliser le type "artifact".

Permission denied (public key)Modifier

Si le dépôt privé se clone bien sans passer par "composer" :

You must be using the interactive console to authenticateModifier

Pour installer cette bibliothèque, il faut que Composer puisse se loguer. Pour ce faire, il utilise auth.json qui peut se trouver dans[7] :

  1. $HOME/.composer/auth.json
  2. ou à côté du composer.json

Exemple de auth.json[8] :

{
    "github-oauth": {
        "github.com": "<snip>"
    },
    "http-basic": {
        "repo.magento.com": {
            "username": "<snip>",
            "password": "<snip>"
        }
    }
}

PHPUnitModifier

Les tests ne se lancent pasModifier

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 rienModifier

Lancer le test en mode le plus verbeux :

  • Avec le paramètre : -vvv
  • Modifier phpunit.xml.dist avec :
    • <server name="SHELL_VERBOSITY" value="3" />[9]
    • <ini name="error_reporting" value="true" />

Les tests fonctionnels renvoient toujours 404Modifier

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

Un var_dump() sature la mémoire.

Did you forget a "use" statement for MaClasse ou Class 'MaClasse' not foundModifier

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é.

No code coverage driver is availableModifier

Installer ou activer Xdebug (en Docker : docker-php-ext-enable xdebug).

The .git directory is missing from...Modifier

Supprimer vendor/ et relancer composer.

THE ERROR HANDLER HAS CHANGED!Modifier

Plusieurs solutions possibles :

  • phpunit --self-update
  • Dans Symfony, changer phpunit.xml.dist avec SYMFONY_DEPRECATIONS_HELPER = weak_vendors
  • set_error_handler(array(&$this, 'handleGeoError'));

Trying to configure method "get" which cannot be configured because it does not exist, has not been specified, is final, or is staticModifier

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 methodModifier

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 givenModifier

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

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.

SymfonyModifier

 
Profiler sous Symfony 2.8.

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.


Une route de contrôleur fonctionne dans un client HTTP mais pas dans un autreModifier

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() au lieu de $request->request[10].

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

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 existeModifier

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.

Circular reference detectedModifier

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 }

CURLPIPE_HTTP1 is no longer supportedModifier

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

Error 400 Bad Request Your browser sent a request that this server could not understand.Modifier

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

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 foundModifier

Un JSON envoyé en POST dans symfony/http-client contient des retours chariots inattendus : les retirer. Ex :

$json = preg_replace("(\r?\n)", , $json);

Maximum function nesting level of '6000' reachedModifier

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

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".

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not knownModifier

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 certificateModifier

Utiliser l'installation avec "Composer.phar" plutôt que "Symfony.phar".

InvalidArgumentException Invalid env(bool:xxx) name: only "word" characters are allowedModifier

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

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).

"The controller for URI \"/api/ma_route/123\" is not callable: Controller \"MonController\" does neither exist a service nor as class."Modifier

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.

DoctrineModifier

Le champ sauvegardé en base est toujours 0Modifier

Se produit quand on utilise l'annotation @ORM\GeneratedValue(strategy="IDENTITY") sur un champ qui n'est pas AUTOINCREMENT en base de données.

DoctrineMigrations n'exécute pas tout (sans logs même en -vvv)Modifier

Séparer en plusieurs migrations, notamment les créations de tables et de fonctions.


Binding an entity with a composite primary key to a query is not supportedModifier

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:299Modifier

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

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[11], 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 Doctrine\Common\Persistence\ManagerRegistry;

class MonEntiteRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, MonEntite::class);
    }

Class "App\Entity\X" seems not to be a managed Doctrine entity. Did you forget to map it?Modifier

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

Il faut juse ajouter la colonne de jointure sous l'annotation *To*. Ex :

@ORM\JoinColumn(name="id", referencedColumnName="id_personne")

Entity has to be managed or scheduled for removal for single computationModifier

  • 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 foundModifier

https://cilefen.github.io/symfony/2016/12/29/doctrine-orm-nulls.html

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

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).

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

  • 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

Se produit lors d'un $qb = $this->entityManager->getEntityManager()->createQueryBuilder(); (sans alias comme dans : $this->createQueryBuilder('me') hérité de EntityRepository)

Il faut alors rajouter un alias pour l'entité courante ainsi :

$qb
    ->select('me')
    ->from(MonEntite::class, 'me')

Property \"metadata\" on resource \"App\\MonEntite\" is declared as a subresource, but its type could not be determined inModifier

Survient quand une entité étend une autre sans discriminator[12].

The association mon_entité1#entité2 refers to the owning side field mon_entité2#id which does not existModifier

Si l'entité 2 ne fait pas référence à l'entité 1, supprimer dans l'entité 1, champ entité2, le mappedBy=.

The EntityManager is closedModifier

Cela survient quand l'EntityManager rencontre une exception. On peut[13] :

  • 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 queryModifier

Se produit lors d'un repository->find(null).

Uncaught Symfony\Component\Debug\Exception\UndefinedFunctionException: Attempted to call function "apc_fetch"Modifier

 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 relationModifier

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.

Unrecognized field (ORMException)Modifier

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.

API PlatformModifier

Invalid IRIModifier

Ajouter le getId() dans l'entité récupérée par IRI.

InvalidArgumentException: "No item route associated with the type xxxModifier

Se produit quand on a pas une route POST sans route GET[14], 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 typeModifier

 /**
  * @ApiProperty(identifier=true)
 */
 private $id;

Si aucun ID n'est possible, en renvoyer "1" par exemple.

Unable to generate an IRI forModifier

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 serializerModifier

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")

TwigModifier

double quoted propertyModifier

Une virgule de trop après une clé.

key \"id\" for array with keys \"0\" does not exist.Modifier

Appel d'une clé absente d'un tableau.

unexpected token "punctuation" of value "{"Modifier

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.

PhpStormModifier

Les logs sont accessibles par :

tail -f ~/.PhpStorm2019.2/system/log/idea.log

Un fichier a disparu des onglets, a un icône de point d'interrogation, et ne peut être rouvertModifier

Il n'est pas ou plus associé à un type de fichier, aller dans File\Associate with File Type.

incoming connection from xdebugModifier

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 separatorsModifier

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[15] vers "System dependent".

Sinon, configurer git :

git config --global core.autocrlf true

XdebugModifier

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 commandeModifier

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'IDEModifier

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'erreurModifier

Cannot find file '/usr/local/php/php/auto_prepends/default_prepend.php' locallyModifier

Sous PhpStorm avec Docker, cliquer sous l'erreur pour modifier le path mapping.

Could not connect to clientModifier

Changer xdebug.remote_host car le serveur est introuvable.

Gateway TimeoutModifier

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[16].
  • Sur Nginx, augmenter fastcgi_read_timeout 60s;[17].
  • Sur IIS, étendre la valeur du paramètre Activity Timeout des FastCGI Settings[18].

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 headerModifier

Si le log Apache affiche cela lors d'un Gateway Timeout, il faut ajouter à httpd.conf[19] :

    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[20] :

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".

Remote file path 'default_prepend.php' is not mapped to any file path in projectModifier

Sous PhpStorm il faut décocher dans les settings, debug, les deux cases Force break..., puis de redémarrer l'IDE[21].

Time-out connecting to clientModifier

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[22] :

   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

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[23].
  • Sur API Platform :

GraphQLModifier

Fields "maRoute" conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.Modifier

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 => ...]].

RéférencesModifier

  1. http://windows.php.net/download/
  2. https://whynhow.info/17522/How-to-get-rid-of-SIGBUS-when-running-php-fpm?
  3. https://www.kinamo.fr/fr/support/faq/determiner-le-nombre-de-processes-valide-pour-php-fpm-sur-nginx
  4. https://www.php.net/manual/fr/function.fopen.php
  5. http://stackoverflow.com/questions/4636166/only-variables-should-be-passed-by-reference
  6. https://stackoverflow.com/questions/24443318/getting-error-no-driver-found-to-handle-vcs-repository-on-composer-and-svn?answertab=votes#tab-top
  7. https://getcomposer.org/doc/articles/http-basic-authentication.md
  8. https://github.com/magento/magento2/issues/2523#issuecomment-159884152
  9. https://symfony.com/doc/current/console/verbosity.html
  10. https://silex.symfony.com/doc/2.0/cookbook/json_request_body.html
  11. https://www.it-swarm.dev/fr/php/service-autowire-impossible-largument-fait-reference-la-classe-mais-ce-service-nexiste-pas/836794307/
  12. https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/inheritance-mapping.html
  13. https://www.kerstner.at/2014/09/doctrine-2-exception-entitymanager-closed/
  14. https://github.com/api-platform/core/issues/3501
  15. https://stackoverflow.com/questions/40470895/phpstorm-saving-with-linux-line-ending-on-windows
  16. https://www.h3xed.com/web-development/php-and-apache-504-gateway-timeout-troubleshooting-and-solutions
  17. http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout
  18. https://www.leighton.com/blog/php-debugging-in-phpstorm-6-0-with-xdebug/
  19. https://support.plesk.com/hc/en-us/articles/115000064929-Website-is-not-accessible-The-timeout-specified-has-expired-Error-dispatching-request-to
  20. https://www.reddit.com/r/drupal/comments/ase67i/for_issue_reference_service_unavailable_error/
  21. https://www.jetbrains.com/help/phpstorm/troubleshooting-php-debugging.html
  22. https://ubuntuforums.org/showthread.php?t=1381516
  23. https://stackoverflow.com/questions/17715128/xdebug-phpstorm-waiting-for-incoming-connection-with-ide-key