web-dev-qa-db-fra.com

L'installation des extensions PECL échoue après la mise à jour de MacOS vers Mojave (10.14)

J'utilise mon Mac pour développer trois projets: une application Android, une application iPhone et un projet Symfony.

Mon projet Symfony utilise les extensions Redis et APCu. Cela a été installé (il y a 6 mois) via PECL en utilisant:

Sudo pecl install redis

et

Sudo pecl install apcu

Hier, après avoir mis à jour mon Mac vers Mojave et essayé de démarrer le serveur Web intégré de PHP comme d'habitude, le message d'erreur suivant s'affiche:

Vous avez tenté de charger la classe "Redis" à partir de l'espace de noms global. As tu oublier une déclaration "use"?

J'ai également remarqué que php.ini avait été supprimé lors de l'installation. J'ai donc utilisé le php.ini-previous pour générer à nouveau le php.ini.

Également réinstallé les outils de ligne de commande (a été supprimé lors de l'installation):

xcode-select --install

Et finalement, j'ai essayé d'installer le redis extenison via PECL, encore une fois:

Sudo pecl install redis

Cette fois, PECL génère une erreur:

creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
running: make
/bin/sh /private/tmp/pear/temp/pear-build-root1vQ0zO/redis-4.1.1/libtool --mode=compile cc  -I. -I/private/tmp/pear/temp/redis -DPHP_ATOM_INC -I/private/tmp/pear/temp/pear-build-root1vQ0zO/redis-4.1.1/include -I/private/tmp/pear/temp/pear-build-root1vQ0zO/redis-4.1.1/main -I/private/tmp/pear/temp/redis -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -c /private/tmp/pear/temp/redis/redis.c -o redis.lo
mkdir .libs
cc -I. -I/private/tmp/pear/temp/redis -DPHP_ATOM_INC -I/private/tmp/pear/temp/pear-build-root1vQ0zO/redis-4.1.1/include -I/private/tmp/pear/temp/pear-build-root1vQ0zO/redis-4.1.1/main -I/private/tmp/pear/temp/redis -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /private/tmp/pear/temp/redis/redis.c  -fno-common -DPIC -o .libs/redis.o
In file included from /private/tmp/pear/temp/redis/redis.c:27:
/private/tmp/pear/temp/redis/common.h:1:10: fatal error: 'php.h' file not found
#include "php.h"
         ^~~~~~~
1 error generated.
make: *** [redis.lo] Error 1
ERROR: `make' failed

Comment peut résoudre ce problème?

5
Isaac Bosca

L'exécution de la commande suivante réinstallera les fichiers d'en-tête des outils de développement et résoudra le problème.

$ Sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
4
donatJ

Vous voudrez faire 

$ locate php.h

les résultats devraient être quelque chose comme: 

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/php/main/php.h /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/php/main/php.h

Ensuite, vous voudrez désactiver SIP afin que vous puissiez créer un dossier dans /usr/include et lier de façon symétrique les dépendances du développeur php à ce dossier. Vous devez démarrer la récupération pour le faire; redémarrez votre machine puis maintenez cmd + R pendant son redémarrage, sélectionnez terminal dans le menu utilitaires.

exécuter # csrutil disable && shutdown -r now 

cela désactive SIP et redémarre votre ordinateur.

Une fois que vous avez démarré, vous aurez envie de créer le dossier dont nous avons parlé comme suit: Sudo mkdir /usr/include

ensuite, nous créons un lien symbolique à l'endroit où se trouvent les fichiers de développement php

$ ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/php /usr/include

Vous devrez toujours activer SIP, alors démarrez en mode de récupération cette fois-ci 

# csrutil enable && shutdown -r now, et c'est tout.

0
Eyo Okon Eyo