为什么 PHP 在“mysql_connect”之后或者在“mysql_close”时抛出“Segmentation Fault (11)”?

为什么 PHP 在“mysql_connect”之后或者在“mysql_close”时抛出“Segmentation Fault (11)”?

我有 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 密码的情况下重现您的症状,因此这显然不仅是好的做法,而且必须非空。

我能够把你的问题变成解决方案

  1. 设置 root 密码
  2. 在连接时从脚本返回一些内容

不要传入“”作为 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”登录并发出一些查询即可。

相关内容