PHP如何判断文件是否在public_html目录以避免$_SERVER变量未定义报错
实现方案
CLI模式下运行Cron脚本时没有Web服务器注入的HTTP相关$_SERVER变量,因此会触发未定义数组键报错。你可以通过校验当前脚本的绝对路径是否属于public_html目录来控制代码执行逻辑,具体实现如下:
- 首先确认你服务器上
public_html目录的绝对路径,常规虚拟主机的路径格式为/home/你的用户名/public_html,你可以在public_html下新建PHP文件执行echo realpath(__DIR__);获取准确路径。 - 用如下if判断包裹原有代码:
// 替换为你自己的public_html绝对路径 $public_html_root = '/home/xxx/public_html'; // 获取当前被执行脚本所在目录的绝对路径 $current_script_dir = realpath(__DIR__); // PHP 8.0及以上版本可用str_starts_with判断前缀 if (str_starts_with($current_script_dir, $public_html_root)) { $page_url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $ip_address = $_SERVER['REMOTE_ADDR']; }
如果你的PHP版本低于8.0,可替换为兼容写法:
// 路径前缀匹配,strpos返回0代表字符串出现在最开头 if (strpos($current_script_dir, $public_html_root) === 0) { $page_url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $ip_address = $_SERVER['REMOTE_ADDR']; }
额外优化建议
为了避免极端场景下(比如public_html目录下的脚本也被CLI调用)出现报错,建议额外添加$_SERVER键存在性校验:
if (strpos($current_script_dir, $public_html_root) === 0 && isset($_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'], $_SERVER['REMOTE_ADDR'])) { $page_url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $ip_address = $_SERVER['REMOTE_ADDR']; }
内容的提问来源于stack exchange,提问作者user17213773
相关产品推荐
相关产品推荐

