6

これは、私が「メンタルログファイル」と呼んでいるメッセージへの簡単なスクリプトです。私が漂流して仕事に戻るときの私の考えを追跡するためだけに。とにかく、ほとんどの場合は問題なく動作しますが、セグメンテーション違反が発生することがよくあります。それらはCで聞いたことがありますが、PHPではこれまでに一度もありませんでした。スクリプトは次のとおりです。

#!/usr/bin/php 
<?php 

    $mental_log_file = "/home/ali/mental-log"; 
    array_shift($argv);      //get rid of the initial arg (name of the command) 
    $log_entry = date('j-n-y H:i') . ' ' . implode(' ', $argv) . "\n";

    file_put_contents($mental_log_file, $log_entry, FILE_APPEND);

これが私がいくつかの実行で得たものです:

ali @ oem-desktop:〜$ mlog blah
ali @ oem-desktop:〜$ mlog blah
セグメンテーション違反
ali @ oem-desktop:〜$ mlog blah
ali @ oem-desktop:〜$ mlog blah
セグメンテーション違反
ali @ oem-desktop:〜$ mlog blah
ali @ oem-desktop:〜$ mlog blah
ali @ oem-desktop:〜$ mlog blah
セグメンテーション違反
ali @ oem-desktop:〜$ mlog blah
ali @ oem-desktop:〜$ mlog blah
セグメンテーション違反
ali @ oem-desktop:〜$ mlog blah
セグメンテーション違反

私がここで間違っている可能性があることについて何か考えはありますか?セグメンテーション違反が発生した実行でも、ファイルは期待どおりに正しく更新されているようです。私はUbuntu9.04Jauntyを実行しています。

ali @ oem-desktop:〜$ php --version
PHP 5.2.6-3ubuntu4.1 with Suhosin-Patch 0.9.6.2(cli)(ビルド:2009年4月23日14:37:14)
Copyright(c)1997-2008PHPグループ
Zend Engine v2.2.0、Copyright(c)1998-2008 Zend Technologies

前もって感謝します。

4

8 に答える 8

9

試す

strace mlog blah

そして、それが死んだときに何をしているかとして、それがいくつかの手がかりを与えるかどうかを確認してください。価値のあることとして、私はあなたが報告したのと同じphpビルドで64ビットのJauntyインストールでそれを再現することができませんでした。

于 2009-07-09T20:13:41.413 に答える
4

どういうわけかめちゃくちゃな拡張機能を持っている可能性が非常に高いです。これは、拡張機能が別のバージョンの php または外部ライブラリ用にビルドされた場合に発生する可能性があります。php.ini ですべての拡張機能を無効にして、問題が解決するかどうかを確認してください。その場合は、違反者が見つかるまで、各拡張機能を一度に 1 つずつ再度有効にします。

于 2009-07-09T22:54:06.423 に答える
3

おそらく、Ubuntu と Debian の両方に影響するこのバグが原因です... https://bugs.launchpad.net/ubuntu/+source/php5/+bug/343870

于 2009-09-07T11:29:12.573 に答える
2

php5-mysql のUbuntu バグ #343870のようです。PHP mysql および mysqli モジュールを無効にすると、セグメンテーション エラーが発生しなくなりました。

于 2009-07-20T14:56:49.273 に答える
1

拡張機能のロード順を変更してみてください。私が抱えていたセグメンテーション違反を取り除くために、curl の前に pgsql を移動する必要がありました。これを読んだ後、私はそれを試しました:

http://linux.m2osw.com/php_cli_segmentation_fault_with_pgsql

于 2010-12-02T15:10:40.317 に答える
0

当然のことながら、複製することはできません。fopen()実験的には、の代わりにを使用してファイルに追加してみますfile_put_contents()

于 2009-07-09T20:18:34.600 に答える
-1

単純なスタック オーバーフローが原因で、このエラーが発生しました。セグメンテーション違反以外のエラーが発生しなかった理由は良い質問ですが、使用stracedie()て問題を追跡しました。

サーバ

Debian 6.0 (スクイーズ)

Linux domain.com 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux

PHP

PHP 5.3.3-7+squeeze14 with Suhosin-Patch (cli) (ビルド: 2012 年 8 月 6 日 14:18:06)

Copyright (c) 1997-2009 PHP グループ

Zend Engine v2.3.0、Copyright (c) 1998-2010 Zend Technologies

Suhosin v0.9.32.1、Copyright (c) 2007-2010、SektionEins GmbH

問題を再現するコード

<?php   
    function Bar() {
        return Bar();
    }
    Bar();
?>

出力

php5オーバーフローtest.php

セグメンテーション違反

Strace 出力 (誰でも何にでも使用できる場合):

パステビン リンク

于 2013-02-28T14:20:30.097 に答える