Mac M1 Silicon 上的 Apache 将不会加载 xdebug.so - “代码签名对于在进程中使用无效”

Mik*_*sen 3 php code-signing apache2.4 xdebug-3 macos-monterey

我正在设置一台新的 MacBook(Monterey 12.2.1 芯片 Apple M1 Pro),并使用自制程序安装了 PHP 7.4。我将 PHP 配置为作为 MacOS (Apache/2.4.51) 附带的 Apache2 服务器的模块运行。我立即遇到了麻烦,因为在我对其进行代码签名之前,Gatekeeper 不允许我将 php 作为自制程序中的 apache 模块运行。我对它进行了协同设计:

codesign --sign "Mike Andersen" --force --keychain ~/Library/Keychains/login.keychain-db /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so

之后 PHP 就完美运行了。然后我用 PECL 安装了 xdebug: arch -x86_64 sudo pecl install xdebug

当我从命令行检查它时,一切看起来都正确:

php -v
PHP 7.4.28 (cli) (built: Feb 28 2022 07:33:39) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.28, Copyright (c), by Zend Technologies
    with Xdebug v3.1.3, Copyright (c) 2002-2022, by Derick Rethans

php --ini
Configuration File (php.ini) Path: /opt/homebrew/etc/php/7.4
Loaded Configuration File:         /opt/homebrew/etc/php/7.4/php.ini
Scan for additional .ini files in: /opt/homebrew/etc/php/7.4/conf.d
Additional .ini files parsed:      /opt/homebrew/etc/php/7.4/conf.d/20-ext-opcache.ini,
/opt/homebrew/etc/php/7.4/conf.d/99-xdebug.ini
Run Code Online (Sandbox Code Playgroud)

但从浏览器加载失败 - 浏览器列出了 99-xdebug.ini 文件:

Additional .ini files parsed    /opt/homebrew/etc/php/7.4/conf.d/20-ext-opcache.ini, /opt/homebrew/etc/php/7.4/conf.d/99-xdebug.ini
Run Code Online (Sandbox Code Playgroud)

但关于 xdebug 就没有其他的了。我检查了 apache 错误日志并看到:

Failed loading /opt/homebrew/lib/php/pecl/20190902/xdebug.so:  
dlopen(/opt/homebrew/lib/php/pecl/20190902/xdebug.so, 0x0009): 
tried: '/opt/homebrew/lib/php/pecl/20190902/xdebug.so' 
(code signature in <8E9B311F-7332-3812-89A8-91BA8FB71682> '/opt/homebrew/lib/php/pecl/20190902/xdebug.so' 
not valid for use in process: mapped file has no Team ID and is not a platform binary (signed with custom identity or adhoc?)), 
'/usr/lib/xdebug.so' (no such file)
Run Code Online (Sandbox Code Playgroud)

我也尝试签署 xdebug.so 文件:

codesign --sign "Mike Andersen" --force --keychain ~/Library/Keychains/login.keychain-db /opt/homebrew/lib/php/pecl/20190902/xdebug.so
/opt/homebrew/lib/php/pecl/20190902/xdebug.so: replacing existing signature
Run Code Online (Sandbox Code Playgroud)

并重新启动apache,但在apache日志中仍然出现相同的错误。我也尝试过重新签署 PHP,但没有帮助。我还尝试禁用网守:

sudo spctl --master-disable
Run Code Online (Sandbox Code Playgroud)

这也没有什么区别。

我整个早上都在谷歌上搜索这个问题,但找不到任何关于如何解决这个问题的信息。现在肯定有人看到了这个,所以我希望你们中的一个人能够帮助兄弟。预先感谢您可以提供的任何帮助。

Mik*_*sen 7

看起来解决此问题的最简单方法是不使用 Apple 随 Mac OS 附带的 Apache。

我用brew安装了apache: brew install apache2

并更新了brew的httpd.conf文件以使用端口80,并指向Exactly。这。相同的。我用于 Apple 的 Apache 的 Libphp7.so 文件。无需重新编译,无需协同设计,什么都没有。然后我停止并禁用Apple的Apache:

sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
sudo apachectl stop
Run Code Online (Sandbox Code Playgroud)

最后,重新启动brew的apache: brew services restart httpd

重新加载我的 phpinfo 文件,所有 xdebug 的优点都在那里。第一次尝试!

我认为这里的根本问题是Apple编译Apache时坚持协同设计,然后使协同设计变得不透明和困难。我仍然很想知道这个问题是否有真正的解决方案,但在那之前,使用 Brew 的 Apache 就可以了。

如果您需要 PHP 协同设计方面的帮助,这是我使用的指南: https: //www.simplified.guide/macos/apache-php-homebrew-codesign