PHP 7.x升级至8.1后exec()调用screen失效问题求助
问题排查与解决步骤
1. 替换PHP为绝对路径
HTTP访问与CLI运行时的环境变量可能存在差异,PHP7.x升级到8.1后,CLI环境下的php命令可能指向旧版本,或者未在screen的会话环境中生效。
- 先查询PHP8.1 CLI的绝对路径:
which php8.1 - 修改
exec()代码,将php替换为上述查询到的绝对路径,示例:exec('screen -S aggiornamento_clicks_DB_Bitly -dm bash -c "cd /var/www/html/Telegram_bot/Daniele/condividi_nel_gruppo_bot; while true; do /usr/bin/php8.1 aggiorna_clicks.php; sleep 300; done;"');
2. 捕获执行日志排查错误
screen进程运行但脚本未执行,大概率是执行过程中出现了隐性错误,可通过重定向输出到日志文件定位问题:
- 修改代码添加日志输出:
exec('screen -S aggiornamento_clicks_DB_Bitly -dm bash -c "cd /var/www/html/Telegram_bot/Daniele/condividi_nel_gruppo_bot; while true; do php8.1 aggiorna_clicks.php >> /var/log/bitly_clicks_run.log 2>&1; sleep 300; done;"'); - 查看日志内容获取错误信息:
cat /var/log/bitly_clicks_run.log
3. 统一screen会话的环境变量
screen在不同用户(如web用户www-data与本地用户)下的环境变量不一致,可能导致命令执行失败:
- 修改代码,强制加载登录shell的环境变量,或显式指定PATH:
其中exec('screen -S aggiornamento_clicks_DB_Bitly -dm bash -l -c "cd /var/www/html/Telegram_bot/Daniele/condividi_nel_gruppo_bot; while true; do php8.1 aggiorna_clicks.php; sleep 300; done;"');-l参数让bash以登录shell模式启动,加载完整的用户环境配置。
4. 检查文件与目录权限
CLI运行screen.php的用户与web访问用户的权限不同,可能导致aggiorna_clicks.php无法被读取或执行:
- 调整目标目录与文件的权限,确保执行用户拥有访问权限:
# 若为web用户运行,设置所属用户为www-data chown -R www-data:www-data /var/www/html/Telegram_bot/Daniele/condividi_nel_gruppo_bot chmod -R 755 /var/www/html/Telegram_bot/Daniele/condividi_nel_gruppo_bot
5. 验证PHP8.1 CLI的扩展配置
手动运行脚本正常,但screen会话中可能使用了不同的php.ini配置,导致依赖的扩展未启用:
- 对比web与CLI环境的PHP扩展列表:
# 查看web环境的已启用扩展 php8.1 -c /etc/php/8.1/apache2/php.ini -m # 查看CLI环境的已启用扩展 php8.1 -m - 若存在缺失的依赖扩展,编辑CLI对应的
php.ini文件启用该扩展,再重启相关服务。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

