web-dev-qa-db-ja.com

PHPが「mysql_connect」の後または「mysql_close」で「Segmentationfault(11)」をスローするのはなぜですか?

私はUbuntu-9.04を持っており、XAMPP-1.7.2を使用してWebアプリケーションを開発しています。問題は、localhost/folder/file.phpにアクセスして作成したPHPファイルを表示しようとすると、FirefoxがファイルをWebページとして表示する代わりにダウンロードするように提案することです。ダウンロードしてお気に入りのテキストエディタで開くと、何も入っていない空のファイルが表示されます...

更新:別のサーバーで動作しますまあ、私はページを別のサーバーにアップロードしました、そして私はそれをうまく見ることができます!したがって、問題はFirefoxではありません。また、コード自体もそうではありません。私のサーバーまたはその構成が問題であるに違いありません。それはあなたの誰かに何が起こっているかについての手がかりを与えますか?

更新:問題の特定 Firefoxは、次の3つのファイルのうち最初のファイルのみをダウンロードすることを提案しています。

test1.phpダウンロードとして提供されます

<?php
    mysql_connect("localhost","root","");
    mysql_close();
?>

test2.php出力:警告:mysql_close():3行目の/opt/lampp/htdocs/test.phpでMySQL-Linkリソースが提供されていません

<?php
    //mysql_connect("localhost","root","");
    mysql_close();
?>

test3.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()を使った私の試みです:test4.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
Shawn

Mysqlのインストールのようなにおいがします。 mysqlはサービスとして実行されていますか?あなたのrootアカウントには本当にパスワードがありませんか?どのmysql拡張機能がphp.iniにロードされていますか? 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エントリはどうですか?

更新:接続関数の戻り値を確認してみましたか?あなたの例は最小限すぎるのではないかと思います。テストを次のように見せてみてください。

<?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のようなものを確実に送り返します。ルートパスワードを設定せずに症状を再現できたので、明らかに良い習慣であるだけでなく、空でないことが必要です。

私はあなたの問題を解決策に変えることができました

  1. ルートパスワードの設定
  2. 接続時にスクリプトから何かを返す

ルートパスワードとして「」を渡す代わりに、それが本当に何もない場合は、パスワードとしてmysql.default_passwordを使用してみてください。 mysql.default_passwordのデフォルト値はNULLです。

1
DaveParillo

これは、ハードウェアの問題またはApache/PHP構成の問題である可能性があります。私は通常、メモリの問題があるSignal11を見てきました。構成を調べて、PHPメモリ制限がApacheメモリ制限などよりも高くないことを確認します。

Php_modがプログラムの途中でクラッシュしているようです。そのため、Apacheは非htmlのcontent-typeヘッダーを使用してphpファイルを投げているだけで、ブラウザはそれをダウンロードとして扱います。しかし、それは単なる推測です。さらに情報を収集する必要があります。

PHPプログラムにいくつかのerror_log()呼び出しを追加して、コードで実際にクラッシュが発生した時期を特定できるようにします。それでも問題を絞り込むことができない場合は、Apacheを設定します。 コアダンプ を作成し、gdbを使用して、セグメンテーション違反がどこから始まるかを把握します。私の賭けはmod_php.soです。

2
mikedub

あなたはそれがすべて稼働していて、単純なファイルが大丈夫に表示されていると言います。しかし、いくつかのファイルはPHPファイルを保存するように促します。これは、壊れているページのコードを調べて保存を求める必要があることを意味します。

コードにサーバーを強制終了する行があるか、PHPの解析をあきらめている可能性があります。

これは、そのページで使用されている特定の拡張機能である場合もあれば、サーバーを腕を組んでそこに座っているだけの別のキルボット関数である場合もあります。

エラーログは、保存ダイアログが表示される前に最後に発生するのはデータベースへの接続であることを示しています。コードに戻って、コードがしっかりしていることを確認してから、発生する可能性のある、または発生しない可能性のある次のトラブルシューティングブレッドクラムに進みます。

別のセットアップ(この場合はeasyPHP)で問題なくファイルを確認できるため、問題はXAMPPセットアップとコードによってトリップされている構成に非常にあります。

1
random

まったく同じエラーが発生しました。 mysqlユーザー権限が正しく設定されていることを確認してください。

コマンドラインでログインし、ログインできることを確認し、関連するデータベースに切り替えて、テーブルとレコードを表示します。コマンド 'mysql -u user -p'を使用してログインし、いくつかのクエリを実行するだけです。

0