最近harmonybrew新增了PHP 8.1到8.5,安装后尝试启动时可能会遇到如下问题:
Sat Aug 29 23:28:52 2026 (32541): Fatal Error Unable to create lock file: Bad file descriptor (9)
原因:php.ini 里默认的 opcache.lockfile_path 位于 /tmp,但鸿蒙的该位置为只读文件夹,不能写入,导致报错。
解决方法:
打开 ~/.harmonybrew/etc/php/*/php.ini,把里面有 /tmp 的行开头的 ; 去掉,然后把 /tmp 改成另一个可以写入的路径(比如 /data/storage/el2/base/files/tmp),然后再创建这个文件夹即可。
备注:建议把tmp目录创建在/data/storage/el2/base/files/里面,不要创建在/storage/Users/currentUser/($HOME)。
前者是f2fs文件系统,可以正常进行lock,可以正常创建unix socket,文件名区分大小写。
后者是HMDFS文件系统,lock操作可能会有问题,并且不能创建unix socket,文件名不区分大小写。
案例:
(pyenv) localhost ~ % php -S 127.0.0.1:8090 -t ~/work/hu60t/hu60wap6/src
Sat Aug 29 23:28:52 2026 (32541): Fatal Error Unable to create lock file: Bad file descriptor (9)
(pyenv) localhost ~ % cd ~/.harmonybrew/etc/php/8.1
(pyenv) localhost ~/.harmonybrew/etc/php/8.1 % cat php.ini | grep /tmp
;sys_temp_dir = "/tmp"
;session.save_path = "/tmp"
soap.wsdl_cache_dir="/tmp"
;opcache.lockfile_path=/tmp
(pyenv) localhost ~/.harmonybrew/etc/php/8.1 % vim php.ini
(pyenv) localhost ~/.harmonybrew/etc/php/8.1 % cat php.ini | grep /tmp
sys_temp_dir = "/data/storage/el2/base/files/tmp"
session.save_path = "/data/storage/el2/base/files/tmp"
soap.wsdl_cache_dir="/data/storage/el2/base/files/tmp"
opcache.lockfile_path=/data/storage/el2/base/files/tmp
(pyenv) localhost ~/.harmonybrew/etc/php/8.1 % mkdir -p /data/storage/el2/base/files/tmp
(pyenv) localhost ~/.harmonybrew/etc/php/8.1 % php -S 127.0.0.1:8090 -t ~/work/hu60t/hu60wap6/src
[Sat Aug 29 23:29:59 2026] PHP 8.1.34 Development Server (http://127.0.0.1:8090) started