PHP内置服务器找不到PDO扩展
我在我的电脑上运行 php -S 127.0.0.1:8000,并在浏览器中打开 my.php,内容如下:
<?php
$pdo = new PDO("...");
$sql = "SELECT 'Hello, World!\n' AS message";
$stmt = $pdo->query($sql);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
echo $result['message'];
?>
接着我遇到了一个异常
"致命错误:未捕获的错误:未找到类 'PDO'"
然而,当我在命令行执行 php my.php 时,PDO类可以正常找到。
我完全不明白为什么在命令行能正常工作的代码,在内置服务器上却不起作用。若有线索,欢迎告知!
从 phpinfo() 我看到Configure Command中有 "--disable-pdo"。但 php -m 输出,尤其是 PDO、pdo_sqlite、pdo_pgsql 以及其他模块。无论如何,在命令行中一切正常,因此问题似乎出现在内置的Web服务器上。
解决方案
感谢各位的评论,经过一些实验后,发现命令行版本的php与内置Web服务器所使用的配置路径不同。在这两种情况下,默认都会从路径 /etc/php/7.4/<php_sapi_name()> 加载配置文件,这一点可以从 phpinfo() 的输出中看得很清楚。这一行为似乎没有很好地文档化,除了较为隐含的描述 "SAPI module specific location" 之外。
问题的根本在于 php_sapi_name() 对命令行来说是 cli,而对内置Web服务器来说是 cli-server。对我而言,这看起来有点反直觉,因为它们都使用同一个 php 可执行文件来调用。
一种解决方案是通过 -c命令行选项 为内置Web服务器提供正确的配置文件。
另一种(也更简单)方案是以正确的名称克隆配置文件目录:
cd /etc/php/7.4
ln -s cli cli-server
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。