问题
由于操作系统不再支持且没有可用的 ppa 包,因此我在 Ubuntu 14.04 中手动构建了 PHP8.4。我测试了phpinfo()
网页是否显示正确信息,但session_start()
在脚本开头添加时,发生了致命错误:
Fatal error: Uncaught Random\RandomException: Cannot open /dev/urandom: No such file or directory in /xxx.php
然后我在终端中运行脚本head /dev/urandom
,我可以获得随机输出,因此文件存在。输入ls -l /dev/urandom
权限时crw-rw-rw-
,我认为其他用户应该可以访问它。
环境
- 服务器硬件:RK3288 armv7l cortex-A17 x4 内核,配备 2GB DDR3 RAM
- 操作系统:Ubuntu 14.04 lts,内核版本 3.10.0
- 网络服务器:带有 php-fpm fastcgi 的 Apache 2.4.7
- PHP 版本:8.4.0-dev
- 构建php时配置命令:
'./configure' '--prefix=/usr/local/php/' '--enable-debug' \
'--enable-fpm' '--with-config-file-path=/usr/local/php/etc/' \
'--enable-json' '--enable-mbregex' '--enable-mbregex-backtrack' \
'--disable-opcache' '--with-curl' '--with-freetype' \
'--enable-gd' '--with-jpeg' '--with-gettext' '--with-kerberos' \
'--with-libdir=lib64' '--with-libxml' '--with-mysqli' \
'--with-openssl' '--with-pdo-mysql' '--with-pdo-sqlite' \
'--with-pear' '--with-mhash' '--with-ldap-sasl' '--with-xsl' \
'--with-zlib' '--with-zip' '-with-bz2' '--with-iconv' \
'--enable-pdo' '--enable-ftp' '--enable-bcmath' '--enable-mbstring' \
'--disable-pcntl' '--enable-shmop' '--enable-soap' \
'--enable-sockets' '--enable-xml' '--enable-sysvsem' '--enable-cli' \
'--enable-intl' '--enable-calendar' '--enable-static' \
'--enable-mysqlnd' 'OPENSSL_CFLAGS=-I/usr/local/openssl/include' \
'OPENSSL_LIBS=-L/usr/local/openssl/lib -lssl -lcrypto' \
'JPEG_CFLAGS=-I/usr/lib/arm-linux-gnueabihf/' \
'JPEG_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -ljpeg' \
'FREETYPE2_CFLAGS=-I/usr/include/freetype2' \
'FREETYPE2_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -lfreetype' \
'ICU_CFLAGS=-I/usr/include/arm-linux-gnueabihf/' \
'ICU_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -licui18n \
-licuuc -licudata -licuio -licule -liculx -licutu' \
'ONIG_CFLAGS=-I/usr/include' 'ONIG_LIBS=-L/usr/lib -lonig' \
'LIBZIP_CFLAGS=-I/usr/local/include/' \
'LIBZIP_LIBS=-L/usr/local/lib/ -lzip'
通过手动编译所有缺失的依赖项,在编译 PHP 之前解决了 configure 输出的所有错误。
我不知道从哪里开始检查,请给出一些提示,例如哪个配置文件可能未正确设置,哪些系统信息值得检查,如何使其打印有关 /dev/urandom 的更多诊断信息等。如果解决问题需要更多信息,请发表评论,我会改进我的问题描述。
解决方案
感谢@symcbean,他提到:
您的 PHP 代码正在 chroot 中运行,或者在 apparmor 配置文件中运行,或者在 systemd 文件系统命名空间中运行。
检查php-fpm的conf文件后发现chroot
已经设置了。取消该参数后,用浏览器访问php脚本时显示No input file specified
。
然后我检查了我的 apache 配置,我尝试添加
ProxyFCGISetEnvIf "true" PHP_ADMIN_VALUE "open_basedir=..."
但是我安装的 apache 版本似乎无法识别“ProxyFCGISetEnvIf”,并抛出“无效命令”错误。
最后我换了
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/
和
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/webroot/$1
现在所有问题都解决了。
一句话,如果No such file or directory
PHP 出现任何错误,则值得检查是否已chroot
对 PHP 进行设置。
答案1
由于操作系统不再支持,我在 Ubuntu 14.04 中手动构建了 PHP8.4
这是一个巨大的危险信号。保持不受支持的操作系统运行需要大量的技能和时间。仅有的最合理的情况是继续运行无法升级的关键任务软件。即使对于专家来说,在不受支持的操作系统上更改软件堆栈也会导致灾难,这驳斥了合理性断言。
然后我在终端中运行脚本 head /dev/urandom
这表明你不是专家。
诊断错误时首先要查看的是日志文件。而不仅仅是 Web 服务器日志。
/dev/urandom 产生二进制输出,这可能会弄乱您的终端设置 - 运行起来更安全head /dev/urandom | cat -v
。
您确实检查了权限 - 因为它们是 x666,所以所有权无关紧要(除非您对 /dev 有奇怪的权限)。但调试问题的下一步是尝试直接从 PHP 脚本访问该文件。您的 PHP 代码正在 chroot 中运行,或者在 apparmor 配置文件中运行,或者在 systemd 文件系统命名空间中运行。
升级平台。