![为什么 PHP 在“mysql_connect”之后或者在“mysql_close”时抛出“Segmentation Fault (11)”?](https://linux22.com/image/1216725/%E4%B8%BA%E4%BB%80%E4%B9%88%20PHP%20%E5%9C%A8%E2%80%9Cmysql_connect%E2%80%9D%E4%B9%8B%E5%90%8E%E6%88%96%E8%80%85%E5%9C%A8%E2%80%9Cmysql_close%E2%80%9D%E6%97%B6%E6%8A%9B%E5%87%BA%E2%80%9CSegmentation%20Fault%20(11)%E2%80%9D%EF%BC%9F.png)
我有 Ubuntu-9.04,正在使用 XAMPP-1.7.2 开发 Web 应用程序。问题是,当我尝试通过访问 查看我编写的 PHP 文件时localhost/folder/file.php
,Firefox 会提示我下载它,而不是将文件显示为网页。如果我下载它并在我最喜欢的文本编辑器中打开它,我会得到一个空文件,里面什么都没有……
更新:在另一台服务器上有效 好吧,我把页面上传到另一台服务器,我可以正常查看!所以问题不在于 Firefox。也不在于代码本身。问题一定是出在我的服务器或其配置上。这能给你们任何关于发生了什么的线索吗?
更新:隔离问题 Firefox 仅提供下载以下三个文件中的第一个:
测试1.php提供下载
<?php
mysql_connect("localhost","root","");
mysql_close();
?>
测试2.php输出:警告:mysql_close():/opt/lampp/htdocs/test.php 第 3 行未提供 MySQL-Link 资源
<?php
//mysql_connect("localhost","root","");
mysql_close();
?>
测试3.php输出空白页
<?php
mysql_connect("localhost","root","");
//mysql_close();
?>
我知道我的服务器已启动并正在运行,并且它告诉我 PHP5 已启动并正在运行。
以下是问题发生时我在 XAMPP 错误日志中看到的内容(为清晰起见,已截断并格式化):
[notice] child pid 7338 exit signal Segmentation fault (11)
哦,并且 Firefox 可以在我的另一台计算机(Windows XP SP3 和 easyPHP 作为服务器)上毫无问题地查看该文件。有人知道我该怎么做才能解决这个问题吗?
更新:使用 error_log()
这是我使用error_log()的尝试: 测试4.php
<?php
error_log("Start of file reached by PHP");
mysql_connect("localhost","root","");
error_log("mysql_connect executed");
mysql_close();
error_log("mysql_close executed");
?>
这是它在 XAMPP 错误日志中生成的内容(为清晰起见,已截断):
[error] [client 127.0.0.1] Start of file reached by PHP
[error] [client 127.0.0.1] mysql_connect executed
[notice] child pid 5338 exit signal Segmentation fault (11)
答案1
闻起来像您的 mysql 安装。mysql 是否作为服务运行?您的 root 帐户真的没有密码吗?php.ini 中加载了哪些 mysql 扩展?有一个php_mssql.dll
很容易被误认为是的php_msql.dll
,但我相当确定php_mssql.dll
仅适用于 Windows。
您是否编辑过 php.ini /opt/lampp/php/php.ini?这些可能有助于调试:
error_reporting = E_ALL & ~E_NOTICE
display_errors = On
display_startup_errors = On ;but you'll want to turn this off soon ;)
mysql.trace_mode = On
还值得一看的是使用的端口号。$MYSQL_TCP_PORT 是否已设置?/etc/services 中的 mysql-tcp 条目怎么样?
更新:您是否尝试过检查 connect 函数的返回值?我想知道您的示例是否太简单。尝试让您的测试看起来像这样:
<?php
$db = mysql_connect("localhost","root","myrootpassword");
if (!$db) {
die('Could not connect: ' . mysql_error());
}
else {
$result = mysql_query("show databases");
print "
<h1>Test executed from ". $_SERVER['SCRIPT_NAME']. "</h1>
\n";
print "Script name: ". $_SERVER['SCRIPT_FILENAME'] ." <hr>\n";
while ($line = mysql_fetch_array($result))
{
print "$line[0]<br>\n";
}
}
mysql_close($db);
?>
此示例可确保无论脚本是否失败,您都会返回类似于 HTML 的内容。我能够在未设置 root 密码的情况下重现您的症状,因此这显然不仅是好的做法,而且必须非空。
我能够把你的问题变成解决方案
- 设置 root 密码
- 在连接时从脚本返回一些内容
不要传入“”作为 root 密码,如果确实没有,请尝试使用 mysql.default_password 作为密码。mysql.default_password 的默认值为 NULL。
答案2
这可能是硬件问题或 Apache/PHP 配置问题。我经常看到 Signal 11 出现内存问题。查看您的配置,确保 PHP 内存限制不高于 Apache 内存限制或类似限制。
听起来你的 php_mod 在程序运行过程中崩溃了,所以 Apache 只是用一个非 html 内容类型标头将 php 文件扔给你,这会使你的浏览器将其视为下载。不过这只是猜测。你需要收集更多信息。
向您的 PHP 程序添加一些error_log()
调用,以便您可以隔离代码中实际发生崩溃的时间。如果这无助于缩小范围,请设置 Apache 以创建核心转储并用gdb
它来找出段错误从哪里开始。我猜是 mod_php.so。
答案3
您说一切都已启动并运行,并且简单的文件显示正常。但是,有些文件提示您保存 PHP 文件。这意味着您必须查看出现故障并要求您保存的页面的代码。
很有可能你的代码中有一行会终止服务器或者让它放弃解析 PHP。
这可能是该页面正在使用的特定扩展,也可能是另一个 killbot 功能,使服务器陷入瘫痪,无法正常运行。
您的错误日志显示,在向您推送保存对话框之前发生的最后一件事是连接到数据库。按照代码返回到该位置并确保它是可靠的,然后再转到下一个可能出现或可能不出现的故障排除线索。
由于您可以在另一个设置上毫无问题地看到该文件,在本例中是 easyPHP,所以问题主要出在 XAMPP 设置和被代码绊倒的配置上。
答案4
我遇到了完全相同的错误。确保 mysql 用户权限设置正确。
登录命令行并确认您能够登录,切换到相关数据库并查看表和记录。只需使用命令“mysql -u user -p”登录并发出一些查询即可。