6 votes

Comment corriger l'avertissement de Drush 8 / PHP 7.2 "count() : Parameter must be an array..."

J'utilise LAMP sur Ubuntu 16.04. J'ai une installation drupal 7 et j'ai installé drush 8.1.3 via Composer version 1.5.2. Je pense qu'il y a un bug dans php7.2 provoque l'erreur comme discuté sur Github, cependant même après avoir appliqué la correction recommandée qui est de mettre à jour la table pear/console_table à la dernière version instruit ici mais le problème reste entier. J'ai également suivi les instructions sur Super utilisateur pour être absolument sûr que j'ai la version la plus récente de pear installé également (je n'ai pas installé PHPunit). Et, pour info, conformément à la La documentation sur l'installation de drush se trouve ici J'ai aussi fait les changements appropriés à mon .bashrc également (ci-dessous).

Chaque fois que je cours drush status Je reçois l'erreur suivante :

count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
count(): Parameter must be an array or an object that implements     [warning]
Countable Table.php:789
PHP executable         :  /usr/bin/php                                 
PHP configuration      :  /etc/php/7.2/cli/php.ini                     
PHP OS                 :  Linux                                        
Drush script           :  /home/webdevusr/vendor/drush/drush/drush.php 
Drush version          :  8.1.13                                       
Drush temp directory   :  /tmp                                         
Drush configuration    :                                               
Drush alias files      :   

Si j'exécute drush sql-connect

Unable to load class Drush\Sql\Sql                                  [error]
Drush\Sql\SqlException: Unable to find a matching SQL Class. Drush   [error]
cannot find your database connection details. in
/home/webdevusr/vendor/drush/drush/commands/sql/sql.drush.inc:541
Stack trace:
#0
/home/webdevusr/vendor/drush/drush/commands/sql/sql.drush.inc(221):
drush_sql_get_class()
#1 /home/webdevusr/vendor/drush/drush/includes/command.inc(422):
drush_sql_connect()
#2 /home/webdevusr/vendor/drush/drush/includes/command.inc(231):
_drush_invoke_hooks(Array, Array)
#3 /home/webdevusr/vendor/drush/drush/includes/command.inc(199):
drush_command()
#4
/home/webdevusr/vendor/drush/drush/lib/Drush/Boot/BaseBoot.php(67):
drush_dispatch(Array)
#5 /home/webdevusr/vendor/drush/drush/includes/preflight.inc(66):
Drush\Boot\BaseBoot->bootstrap_and_dispatch()
#6 /home/webdevusr/vendor/drush/drush/drush.php(12): drush_main()
#7 {main}

Le contenu de mon ~/.bashrc sont les suivants :

export PATH="$HOME/.composer/vendor/bin:$PATH"

export PATH=/bin:/usr/local/bin:/usr/local/mysql/bin:$PATH

# Include Drush bash customizations.
if [ -f "/home/webdevusr/.drush/drush.bashrc" ] ; then
source /home/webdevusr/.drush/drush.bashrc
fi

# Include Drush completion.

if [ -f "/home/webdevusr/.drush/drush.complete.sh" ] ; then
source /home/webdevusr/.drush/drush.complete.sh
fi

# Include Drush prompt customizations.

if [ -f "/home/webdevusr/.drush/drush.prompt.sh" ] ; then
source /home/webdevusr/.drush/drush.prompt.sh
fi

Le résultat de drush cc all exécuté à partir de mon dossier d'installation de Drupal est :

No Drupal site found, only 'drush' cache was cleared. 

Quelqu'un sait-il comment faire fonctionner drush pour mes installations locales (LAMP) de Drupal 7 ?

2voto

EricLavault Points 140

Dans le fichier .config/composer/vendor/pear/console_table/Table.php on peut voir que la fonction impliquée _updateRowsCols($rowdata = null) a une signature erronée, son argument étant affecté null par défaut - pas dénombrable .

Plutôt que d'utiliser le @ car il pourrait rendre muets plus d'erreurs/alertes que prévu, il est préférable de corriger la signature de la fonction :

function _updateRowsCols($rowdata = []) {...}

... et/ou d'utiliser le Opérateur de coalescence nul ?? pour revenir en toute sécurité à un tableau vide (mais dénombrable) dès l'appel de la fonction :

$this->_max_cols = max($this->_max_cols, count($rowdata ?? []));

[Il est intéressant de noter que la correction de ce problème a été intégrée dans la base de données de l'UE. pear/Console_Table en octobre 2017 alors que la question a été posée en 2018... donc il suffit d'utiliser la dernière version.... Quoi qu'il en soit, juste pour information voici le code fix qui utilise un opérateur ternaire probablement pour la rétrocompatibilité :

function _updateRowsCols($rowdata = null)
    {
        // Update maximum columns.
        $this->_max_cols = max($this->_max_cols, is_array($rowdata) ? count($rowdata) : 0);

        ...
    }

1voto

stackerph Points 19

Vous pouvez éditer .config/composer/vendor/pear/console_table/Table.php ou chercher ce fichier dans votre système. Ouvrez-le avec votre éditeur préféré et éditez la ligne 789. Mettez le silence comme ceci :

@$this->\_max\_cols = max($this->\_max\_cols, count($rowdata));

Vous êtes prêt à partir.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X