1

CodeIgniter 2.0.2 で単純なファイル アップローダを作成しています。以下にコードを貼り付けます。特定の条件下このアップロード中にブラウザがハングし、ブラウザのステータスバーに「localhost を待機中」と表示されます (FF と Chrome で同じ動作)。ファイルが Windows の一時フォルダー (完全なファイル) にアップロードされていることを確認しましたが、その後プロセスが停止します。バグの条件はファイルサイズのようです。しかし、私の php.ini にはファイルをアップロードするためのすべての適切な設定があり、それでも 700k ファイルで問題が発生します。このバグは、Ubuntu ボックスではなく、Windows 7 Apache で実行した場合にのみ発生します。php.ini の一部のパスが正しく設定されていない可能性があることが示唆されました。エラーがスローされないため、ここでは Apache ログ ファイルはあまり役に立ちません。Chrome 開発者パネルを使用してデバッグしようとしましたが、有用なものは見つかりませんでした。現在、XDebugを機能させようとしていますが、エラーがスローされず、プロセスが完了しないため、私の期待は低くなります。このバグを追跡する方法について何か提案はありますか? 表示したい特定の php.ini 設定がある場合は、知らせてください。大きなダンプを実行したくありません。

コントローラ:

function do_upload_sql(){
    // create directory
    if (! is_dir(BACKUP_DIR)) {
        mkdir(BACKUP_DIR, 0777);
    }
    // or if it exists and has restricted file permissions, change them
    elseif(fileperms(BACKUP_DIR)!=0777){
        chmod(BACKUP_DIR, 0777);
    }

    $config['upload_path'] = BACKUP_DIR;
    $config['allowed_types'] = 'backup'; // an SQL backup file type
    $config['overwrite'] = TRUE;
    $this->load->library('upload', $config);
    if ( ! $this->upload->do_upload()) // this is the native CI function, probably where the problem is. I can provide some of that code if anyone wants.
    {
        $data['action'] = 'c_backup_restore/do_upload_sql';
        $tab_error = array('error' => $this->upload->display_errors());
        $data['error'] = $tab_error['error'];
        $this->load->view('common/header');
        $this->load->view('v_upload_sql', $data);
    }
    else
    {
        echo "success"; // yes it's getting here, but i get no file!
        $data = array('upload_data' => $this->upload->data());
        $file_upload = $data["upload_data"];
        $this->restore_backup($file_upload); // go do something useful with the file
    }
}

意見:

<p>Select the backup file</p>
<div class="not_success"><?php echo $error;?></div>
<?php echo form_open_multipart($action);?>
<input type="file" name="userfile" size="30" />
<input type="submit" value="Upload" />
</form>
4

1 に答える 1

0

エラーが Windows 7 Apache でのみ発生する場合、問題は「is_dir()」「mkdir()」および「chmod()」コマンドにある可能性があると思います。これらの端末コマンドは Linux 固有のものであり、うまく機能しません。 Windows システムで。

次の場所にある PHP.net マニュアルの mkdir() 関数に関するドキュメントを調べました。

http://us.php.net/manual/en/function.mkdir.php

コメントセクションでこれを見つけました:

kendsnyder at gmail dot com 04-May-2007 08:17 Windows でディレクトリを作成するとき、末尾のピリオド (".") は無視されます。例えば:

<?php

mkdir('c:/Buck Jr.',0755);    // on Windows creates "c:/Buck Jr"
mkdir('c:/Elipses...',0755);  // on Windows creates "c:/Elipses"
mkdir('c:/php.com',0755);     // on Windows creates "c:/php.com"

?>

This is a Window's quirk, not a php shortcoming--meaning that you get the same results  from a Window's command prompt.

動作するように見えますが、Windows システムが好むフレーバーを見つけるためには、これをいじる必要があるでしょう。また、ディレクトリを作成するルート ドライブを指定する必要があるようです (例: 'c:\somedir')。

また興味深いことに、Google で簡単に検索したところ、使用している機能に関するバグが PHP で公開されていることがわかりました。具体的には、Windows と Linux システムのフォワード スラッシュとバック スラッシュに関連しています。

https://bugs.php.net/bug.php?id=29797

あなたの質問に関連するStackOverflowの投稿は次のとおりです。

PHP mkdir()、chmod()、および Windows

要約すると:

  • Windows ベースの Web サーバーでは、ディレクトリが配置されるドライブを含めます。

  • Windows のファイル許可は Linux とは異なります (Windows には Linux のような chmod やファイル許可構造はありません!) Windows はフォルダーに 777 の許可レベルと同等の権限を与えると想定されていますが、この機能にはバグがあるようです。そしてエラーが発生しやすい。ただし、これは、Windows システムで chmod() 関数を使用すると、予期しない結果が生じることも意味します。詳細については、PHP マニュアルを参照してください: http://php.net/manual/en/function.chmod.php

  • Windows システムではバック スラッシュが使用されますが、Linux ではスラッシュが使用されるため、ディレクトリ パスにはスラッシュではなくバックスラッシュを使用することを忘れないでください。

  • PHP がディレクトリを作成するとき、PHP が実行されているユーザー アカウントに付与された権限を使用します。つまり、Windows を掘り下げて、Windows 7 Apache/PHP が実行されているユーザー権限レベルを見つけて、それを作成する必要がある場合があります。そこで変わる。私は知っています、何の痛みですよね?

  • 最後に 1 つ: mkdir() 関数は、ディレクトリの作成が成功した場合は true を返し、失敗した場合は false を返します。ディレクトリが適切に作成されない場合は、コードの残りの部分に進む前に、その条件をテストすることをお勧めします。 、既存のそのディレクトリに依存する残りのコードはすべて失敗します。最終的には、ブラウザが送信時にハングしていると思います。これは、Windows (chmod) ではサポートされていない PHP を介して関数にアクセスしようとしているためです。「Try/Catch」ブロック内で関数呼び出しを実行して、発生した例外をキャッチし、必要に応じて画面またはログ ファイルに出力できるようにします。

    $proceed = false;
    try
    {
         // create directory
         if (! is_dir(BACKUP_DIR)) {
             $proceed = mkdir(BACKUP_DIR, 0777);
         }
         // or if it exists and has restricted file permissions, change them
         elseif(fileperms(BACKUP_DIR)!=0777){
             $proceed = chmod(BACKUP_DIR, 0777);
         }
    }
    catch(Exception $e)
    {
        echo $e->message;
    }
    
    if($proceed == TRUE)
    {
        /*Proceed with your code*/
    }
    else
    {
       /*Gracefully fail*/
    }
    

    頑張ってください。これが、私が Web サーバーに Linux Box を好む理由です。

    乾杯!

于 2012-06-09T20:05:52.760 に答える