2012-05-10 5 views
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 
    } 
} 

ビュー:あなたのエラーはWindows上でのみ発生する場合は

<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> 
+0

おそらく '$ this-> restore_backup($ file_upload)'がハングするのでしょうか?この行をコメントして何が起こるかを見てください。 –

+1

xdebugは記録のためだけにスクリプトが実行されるときにプロファイリングデータを書き込むので、スクリプト自体が終了しなくても見ることができます。 – Mahn

+0

私はxdebugプロファイリングがあり、結果をwinCacheGrindにロードしました。今度はプロファイリングを解釈する... –

答えて

0

は7 apacheの、私は(あなたの問題は、 "is_dir()"「MKDIRであってもよいことだと思います) "と" chmod() "コマンド - これらのターミナルコマンドはLinux固有のもので、Windowsシステムではあまり効果がありません。

私はでPHP.netのマニュアルにMKDIR()関数のドキュメントを見上げ:

kendsnyder Gmailのドットで:私はコメント欄でこれを見つけた

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

com 2007年5月4日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() and Windows

ので要約します。WindowsベースのWebサーバー上の

  • を含み、ディレクトリが置かれるドライブ

  • Windowsでのファイルアクセス権はLinuxとは異なります(WindowsにはLinuxのようなchmodやファイルのアクセス権構造はありません)。私はWindowsが想定していることから、フォルダに777のアクセス権レベル機能はバグがあり、エラーが発生しやすいようです。しかし、これはまた、Windowsシステムでchmod()関数を使用すると、予期しない結果が生じることを意味します。詳細については、PHPマニュアルを参照してください。PHPマニュアル:

    Windowsシステムではバックスラッシュを使用するため、Linuxではスラッシュが使用されるため、ディレクトリパスにはスラッシュではなく円記号を使用してください。

  • PHPがディレクトリを作成すると、PHPが実行されているユーザアカウントに付与されている権限が使用されます。つまり、Windows 7 Apache/PHPのユーザ権限レベルを見つけるために、下に走って、そこに変えてください。私は知っている、何の痛み、そうですか?

  • 最終的なもの:mkdir()関数は、ディレクトリの作成が成功した場合はtrueを返し、そうでない場合はfalseを返します。残りのコードを処理する前にその条件をテストしたい場合があります。正しく作成されていれば、そのディレクトリに依存している残りのコードはすべて失敗するでしょう。最終的には、Windows(chmod)上でサポートされていないPHPを介して関数にアクセスしようとしているため、ブラウザは提出時にぶら下がっていると思います。

    $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*/ 
    } 
    

    幸運の男、私は、Linuxを好む理由です:あなたが必要な場合は、ログファイルを画面やそれらを印刷できるように発生する例外をキャッチするために「のtry/catch」ブロック内で呼び出す関数を実行しますWebサーバーのためのボックス!

    乾杯!

関連する問題