【问题标题】:How to debug browser hang during upload如何在上传期间调试浏览器挂起
【发布时间】:2012-05-10 21:02:13
【问题描述】:

我正在 CodeIgniter 2.0.2 中编写一个简单的文件上传器。下面粘贴代码。 在某些条件下,浏览器在此上传期间挂起,我在浏览器状态栏中看到“等待本地主机”(FF 和 Chrome 中的行为相同)。 我已经验证该文件正在上传到 Windows 临时文件夹(完整文件),但之后该过程卡住了。 似乎该错误的条件是文件大小。但是我的 php.ini 具有上传文件的所有正确设置,而且我仍然可以使用 700k 文件。 仅当我在 Windows 7 Apache 上运行它时才会出现此错误,而不是在 Ubuntu 机器上运行。 向我建议 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>

【问题讨论】:

  • 可能是$this-&gt;restore_backup($file_upload) 挂了?尝试评论这一行,看看会发生什么。
  • 只是为了记录,xdebug 确实会在脚本运行时写入分析数据,因此即使脚本本身永远不会结束,您也可以查看一些内容。
  • 好的,我已经进行了 xdebug 分析,并将结果加载到 winCacheGrind 中。现在解释分析...
  • 附带说明,为了调试这个脚本,你必须使用 PHP 调试器,因为这是服务器端代码,所以像 Chrome 网页调试器这样的东西不能用于这个 --您必须使用某种 IDE(如 Eclipse PHP IDE 或其他东西)来执行脚本,以便在运行时操作期间调试脚本。您的另一个选项是打开 PHP 错误报告(不要忘记在生产时将其关闭!),只需在要调试的脚本中包含这两个命令:ini_set('display_errors',1); error_reporting(E_ALL); 这将允许 PHP 打印任何错误到屏幕。

标签: codeigniter file-upload php


【解决方案1】:

如果您的错误仅发生在 windows 7 apache 上,我认为您的问题可能与“is_dir()”、“mkdir()”和“chmod()”命令有关——这些终端命令是特定于 linux 的,不会在 Windows 系统上工作得很好。

我在 PHP.net 手册中查找了有关 mkdir() 函数的文档:

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

我在 cmets 部分找到了这个:

kendsnyder 在 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() and 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 的用户权限级别正在运行并在那里进行更改。我知道,很痛苦,对吧?

  • 最后一件事:如果目录创建成功,mkdir() 函数返回 true,否则返回 false——您可能希望在继续执行其余代码之前测试该条件,因为如果目录没有正确创建后,依赖于现有目录的所有其余代码都将失败。最终,我认为您的浏览器在提交时挂起,因为它试图通过 PHP 访问 Windows(chmod)不支持的函数。在“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!

    干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2017-08-12
    • 2012-12-20
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多