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


1

私はUbuntu-9.04を持っていて、XAMPP-1.7.2を使ってWebアプリケーションを開発しています。問題は、私が訪れて書いたPHPファイルを見ようとした時です。 localhost/folder/file.phpFirefoxでは、ファイルをWebページとして表示するのではなく、ダウンロードするように求められています。ダウンロードして私のお気に入りのテキストエディタで開くと、何も入っていない空のファイルが表示されます。

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

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

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

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

test2.php 出力:Warning: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)

error_logが同期ログファイルを強制するかどうかわからない:複数のソースからのメッセージ たぶん メッセージが生成される正確な順序で表示されません。そうではありませんが、実際のエラー たぶん 発生しています error_logが実行されました。 (そしてFirefoxが試みるダウンロードは ではない あなたの問題は、どのHTTPヘッダがそのファイルと一緒に送信されているのかを見ることです。特にContent-Typeはおそらくブラウザが受け取ったと思うものをあなたに伝えるでしょう。例えば、FirebugのNetパネルを見てください。 getfirebug.com/net.html
Arjan

4
これはスタックオーバーフローではありませんか?
Brian Ortiz

HTTPヘッダーを見てみましたが、Firefoxがページのダウンロードを申し出ても、[Net]タブには何も表示されません。だから私はヘッダを見ることすらできません...これはFirefoxがファイルをどのように見るかについて何を意味するのでしょうか?
Shawn

回答:


1

あなたの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エントリはどうですか。

更新: 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. 接続時にスクリプトから何かを返す

ルートパスワードとして ""を渡すのではなく、実際には何もない場合は、mysql.default_passwordをパスワードとして使用してみてください。 mysql.default_passwordのデフォルト値はNULLです。


mysqlがサービスとして実行されているかどうかはどうすればわかりますか?自分のrootがパスワードを持っているかどうかはわかりませんが、パスワードを使用しているかどうかにかかわらず、さまざまなユーザーでサンプルコードを試してみましたが、役に立ちませんでした。拡張機能に関しては、XAMPPを最初にインストールしてからインストールしていません。 php_mssql.dllが見つかりません。私はecho($ MYSQL_TCP_PORT)を試しました。ここに私が得るものです通知:未定義の変数:2行目の/opt/lampp/htdocs/test.phpのMYSQL_TCP_PORT php.iniの他の設定は私の問題に何も変わりません。
Shawn

XAMPPのコントロールパネルを見てみてください。アプリケーション - &gt;その他 - &gt; XAMPPコントロールパネルパスワードを設定しなかった場合は、デフォルトで空白になります。もし、あんたが した パスワードを設定すると、あなたが使用している例は空白のものになっているので、接続は失敗するでしょう(しかし私はクラッシュを期待しないでしょう)。してはいけません 見つける php_mssql.dll、それはwindows dllです - しかし、あなたが誤ってその拡張子を有効にしたならば、あらゆる種類の悪いことが起こるかもしれません。実行を検討する必要があります /opt/lampp/lampp security
DaveParillo

それは面白い。私はいつもアプリケーションタブになぜXAMPPのエントリがないのか疑問に思っていました。確かに、私はあなたが話すその他のリンクを見つけることができません。アプリケーションでは、私はアクセサリー、ゲーム、グラフィック、インターネット、オフィス、プログラミング、サウンドとアンプだけを持っています。ビデオ、システムツール、追加と削除...そしてXAMPPに関連するものは何も見つかりません。 sudo / opt / lampp / lampp startでXAMPPを起動します。
Shawn

クイックセキュリティチェック...あなたのXAMPPページはパスワードで保護されていません。パスワードを設定しますか? [はい]いいえMySQLはネットワーク経由でアクセス可能です。通常はお勧めできません。あなたは私にそれをオフにして欲しいですか? [はい]はい... MySQL / phpMyAdminユーザーpmaにパスワードが設定されていません。パスワードを設定しますか? [はい]はい...新しいMySQL pmaパスワードを設定します。 phpMyAdminのpmaパスワードを新しいものに設定します。 MySQLにはルートパスワードが設定されていません。パスワードを設定しますか? [はい]いいえユーザー 'nobody'のFTPパスワードはまだ 'lampp'に設定されています。パスワードを変更しますか? [はい]いいえ完了。それはいいですか?
Shawn

phpMyAdminを使って接続できますか?
DaveParillo

2

これはハードウェアの問題か、Apache / PHPの設定の問題です。私は通常Signal 11にメモリの問題があるのを見ました。あなたの設定を見て、PHPのメモリ制限がApacheのメモリ制限以下でないことを確認してください。

あなたのphp_modがプログラムの途中でクラッシュしているように聞こえます、それでApacheはあなたのブラウザがダウンロードとしてそれを扱うようにする非HTML content-typeヘッダであなたにphpファイルを単に投げています。しかし、それは推測にすぎません。もう少し情報を集める必要があります。

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


&lt;?php error_log( "PHPでファイルの先頭に到達しました\ n"、3、 "/opt/lampp/htdocs/webÉchange/SiteWeb_V5/errorLog.txt"); ?欠陥のあるファイルのうちの1つを開始したばかりですが、errorLog.txtは空白のままです。私は&lt;?php error_log( "PHPが到達したファイルの終わり"、1、 "shawninder@gmail.com"、 "From:shawninder@gmail.com")を使ってみました。 ?&gt; shawninder@gmail.comが私の電子メールですが、それでも何も起こりません。 Apacheの設定に関しては、どうすればよいかわかりません。実際、私はXAMPPで何かを設定することについてほとんど情報を見つけていません...
Shawn

私はコアダンプを読みましたが、率直に言って理解できません。コマンドラインで理解できないことが多すぎるとシステムが壊れる可能性があることを私は知っているので、私はこの特定の旅に進むことをためらっています。問題が発生した場所を特定することができたため、上記の質問を編集しました。あなたはそれをチェックして、コアダンプが本当に私が必要とするものであるかどうか私に言ってもらえますか?ありがとう
Shawn

errorLog.txtを作成することにはパーミッションの問題があると思います。 2番目と3番目の引数を削除しないのはなぜですか?それからあなたのメッセージはあなたのデフォルトのerror_logファイルに追加されます。あなたがコアダンプをすることに慣れていないならば、あなたはおそらくそうすべきではありません。次の質問は、test1.phpファイルをダウンロードした後に何が表示されるのですか?
mikedub

引数を1つだけ指定してerror_logを試したところ、うまくいきました。私は私の最初の投稿を編集し、私の試みの結果を追加しました。ダウンロードしたファイルの内容は何もしていません。それをダウンロードしてgeditで開くと、空のファイル(0バイト、btw)ができます。それも私の最初の投稿で編集されました。ご覧のとおり、mysql_close()までのすべてが実行されます。それからそれはクラッシュします。しかし、ダウンロード時にファイルが空白になっています..これはどういう意味ですか?今まであなたの助けを本当にありがとう。
Shawn

まあ、それはPHPでMySQLクライアントに問題を隔離します。上の例#1のコードを試してみます。 mysql_close manページ[ us.php.net/mysql_close] 接続が実際に作成されたかどうか、または mysql_close 呼び出しがセグメンテーション違反を引き起こしています。
mikedub

1

あなたはそれがすべて稼働中で、単純なファイルが問題なく表示されていると言っています。しかし、それからいくつかのファイルはあなたにPHPファイルを保存するように促しています。これは、壊れているページを保存してほしいというページのコードを見なければならないことを意味します。

たぶん、あなたは、サーバを殺しているか、あるいはPHPをパースすることをあきらめているだけの行をコードの中に持っているでしょう。

これは、そのページで使用されている特定の拡張機能である可能性があります。または、腕を組んでサーバーをただそこに座って動かすような他のkillbot機能である可能性もあります。

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

別のセットアップで問題なくファイルを見ることができるので、この場合easyPHP、問題はXAMPPセットアップとコードによって引き起こされている設定に非常にあります。


それでは、XAMPPのセットアップと設定に何が問題があるのか​​を判断するにはどうすればよいですか。それともXAMPPをめちゃくちゃにしている私のコードの何が悪いのかをどうやって判断するのですか?
Shawn

2
@ Shawn、それを修正することについてはどうですか ユーザー 'user' @ 'localhost'のアクセスが拒否されました MySQLの設定で...?
Arjan

@Shawn Arjanは正しいです。データベースにログインできないという行からデバッグを開始します。あなたの設定はおそらくXAMPPとeasyPHPの間で同じではなく、これはデータベースの設定を含みます。
random

さて、私はAccess denied問題を解決しました、今度はSegmentation faultしか得られません(質問を編集しました)
Shawn

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.