如何通过Bash脚本调用PHP mail函数发送指定日志文件内容?
解决方法
你的问题出在两个核心点:
- Bash变量赋值语法错误:
LOGFILE = /path里的等号前后不能有空格,正确写法是LOGFILE=/path - PHP命令行的单引号会阻止Bash解析变量:单引号包裹的PHP代码里的
$LOGFILE会被PHP当成自身未定义的变量,而非Bash变量。
下面是几种可行的解决方式:
方式1:让Bash读取文件内容并传递给PHP
用Bash的命令替换$(cat "$LOGFILE")读取文件内容,同时用双引号包裹PHP代码,让Bash解析其中的变量/命令:
LOGFILE="/srv/users/log/php7.4.error.log" php -r "mail('example@example.com', 'Logs', '$(cat "$LOGFILE")', 'From:my@epicserver.xyz');"
注意:如果日志文件包含单引号、反斜杠等特殊字符,这种方式可能会破坏PHP代码的语法,需要额外转义处理。
方式2:让PHP直接读取日志文件(推荐)
跳过Bash变量传递,直接让PHP用file_get_contents读取文件,避免特殊字符问题,稳定性更高:
php -r '$logContent = file_get_contents("/srv/users/log/php7.4.error.log"); mail("example@example.com", "Logs", $logContent, "From:my@epicserver.xyz");'
方式3:通过环境变量传递文件路径给PHP
如果需要动态指定日志文件路径,可以把Bash变量设为环境变量,让PHP通过getenv获取:
LOGFILE="/srv/users/log/php7.4.error.log" export LOGFILE php -r '$logContent = file_get_contents(getenv("LOGFILE")); mail("example@example.com", "Logs", $logContent, "From:my@epicserver.xyz");'
内容的提问来源于stack exchange,提问作者Avatar
相关产品推荐
相关产品推荐

