【问题标题】:showing internal server issue while uploading a big file上传大文件时显示内部服务器问题
【发布时间】:2012-12-04 11:40:39
【问题描述】:

我正在尝试通过 php 代码上传一个 excel 文件。如果该 excel 文件包含 200 条记录,那么它可以正常工作。但是,如果该 excel 文件包含超过 500 条记录,那么它会显示 "Internal Server Error",尽管我设置了以下内容:

set_time_limit(10000);
ini_set('memory_limit', '256M');
ini_set('upload_max_filesize', '30M');
ini_set('post_max_size', '200M');
ini_set('max_input_time', 1000);

另外,在文件内部我做了很多,从excel文件中读取数据并存储在一个数组中,然后再次从数据库中检查数据库中是否存在任何元素,。如果是这样,则删除该特定数据。再次为剩余的数据,插入一个表并检查一些条件与日期。最后将剩余的 push 放入一个数组中。 那么有没有办法解决这个内部服务器错误问题呢?如果有,请告诉我。

代码如下:

    <?php
    ini_set("display_errors", 1);
    set_time_limit(10000);
    ini_set('memory_limit', '256M');
    ini_set('upload_max_filesize', '30M');
    ini_set('post_max_size', '200M');
    ini_set('max_input_time', 1000);
    ?>
    <fieldset style="border:2px solid #60006B;">
      <legend >Upload Excel File</legend>
        <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
           <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
           <table width="600">
             <tr>
                <td>Excel File:</td>
                <td><input type="file" name="cur_pic" style="border:1px solid #ccc;" /></td>
             </tr>
             <tr>
                <td colspan="2" style="padding-left:150px;"><input type="submit" value="Upload" name="upload" class="button" /></td>
             </tr>
            </table>
           </form>
        </fieldset>
<?php
  if(isset($_REQUEST['upload'])){
    $image =$_FILES["cur_pic"]["name"];
    $uploadedfile = $_FILES['cur_pic']['tmp_name'];
    if ($image) {

      $filename = stripslashes($_FILES['cur_pic']['name']);

      $extension = getExtension($filename);
      $extension = strtolower($extension);

      if (($extension != "xls") && ($extension != "xlsx")) 
      {

        $change='<div class="msgdiv">Unknown file extension </div> ';
            $errors=1;
       }
       else
       {
         $size=filesize($_FILES['cur_pic']['tmp_name']); 
         move_uploaded_file($_FILES["cur_pic"]["tmp_name"],"sampleData/" . $_FILES["cur_pic"]["name"]);
        }
    }

   set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');

/** PHPExcel_IOFactory */
   include 'PHPExcel/IOFactory.php';
   $inputFileName = './sampleData/'.$_FILES["cur_pic"]["name"];
   echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory to  identify the format<br />';
   $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
   echo '<hr />';
   $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
   foreach($sheetData as $key => &$value) {
    if(is_array($value) && isset($value['A'])) $value = $value['A'];
   }
   $sql = mysql_query("SELECT email,type FROM subscribe WHERE status='0'");
   $ultimate_array = array();
   while($res = mysql_fetch_array($sql)){
     if($res['type'] == '1'){
      if (in_array($res['email'], $sheetData)) {
    unset($sheetData[array_search($res['email'], $sheetData)]);
      }
     }
   } 

   $replace_string2 = array_unique($sheetData);

   $today_date = date('Y-m-d h:i:s');

   foreach($replace_string2 as $ins_email){
    $chk_email = mysql_num_rows(mysql_query("SELECT id FROM add_email WHERE email='".$ins_email."'"));
    if($chk_email == 0){
        mysql_query("INSERT INTO add_email VALUES('','".$ins_email."','".$today_date."','1')");
    }
   }

   $final_email = array();
   foreach($replace_string2 as $f_email){
     $orig_sql = mysql_query("SELECT email,status FROM add_email WHERE email='".$f_email."'");
     while($res = mysql_fetch_array($orig_sql)){
        if($res['status'] == 1){
      array_push($final_email,$res['email']);       
        }
    else if($res['status'] == 0){
       $days = mysql_fetch_array(mysql_query("SELECT day FROM days"));
       $sql = mysql_query("SELECT email FROM add_email WHERE email='".$res['email']."' AND  DATEDIFF( NOW(),sending_date) > ".$days['day']);
       $no = mysql_num_rows($sql);
       if($no > 0){
        array_push($final_email,$f_email);  
           }    
         }
    }

     }

     $final_emails = array_unique($final_email);

     $_SESSION['record'] = $final_emails;

     foreach($final_emails as $ca){
    $ca_trim = trim($ca);
    mysql_query("UPDATE add_email SET sending_date='".$today_date."',status='0' WHERE email='".$ca_trim."'");
     }
            header('location:https://fgtpl.com/fugenx1/public_html/unsubscribe/Tests/14excel5.php');

}

【问题讨论】:

  • 内部服务器错误是一条用户友好的消息。您应该在浏览器中禁用它以查看我们可以使用的实际错误消息。

标签: php upload


【解决方案1】:

您可以检查 php.ini 文件中的 disable_functions 设置。如果这是共享主机做

&lt;?php echo phpinfo(); ?&gt; 检查设置。

如果共享主机是一个案例,我严重怀疑您是否可以上传 200MB。

【讨论】:

  • 这是一个专用服务器,就我而言,我正在上传一个 28.4 kb 的 excel 文件。但在该文件中,它包含 1119 条记录。我希望,在我的代码中,有这么多循环正在发生。我应该分享我的完整代码吗?
  • 只分享这个上传部分,并将 ini_set("display_errors", 1) 放在上传页面的顶部。
  • 我已经编辑了我的代码。请参见。我还添加了那些创建最终数组的处理代码。我还添加了 ini_set("display_errors", 1);但没有显示错误。
  • 作为信息,有时我得到准确的输出,有时在更改行 set_time_limit(1000); to set_time_limit(0);
  • 非常感谢大家。我得到了结果。我只是在我的数据库中使用 indexng 概念。它帮助我取得成功。
【解决方案2】:

如果您有专用服务器,您可以这样做:

  1. 登录到您的服务器
  2. 如果您在服务器上运行 whm+cpanel,请执行此操作

    tail -f /usr/local/apache/error.log 然后尝试上传。如果发生错误,您会在这里看到原因

  3. 如果你不使用 whm+cpanel 这样做

    tail -f /var/log/apache/error.log 然后尝试上传。如果发生错误,您会在这里看到原因

在这两种情况下,您都需要找到您的 apache 错误文件。将 apache 日志文件的错误输出粘贴到此处。

【讨论】:

  • 其实我用的是windows,有什么选项可以从ftp查看error.log文件。我从 godaddy 购买了服务器。
  • 或者您的文件可能以某种方式损坏。您是否尝试上传其他文件?
  • 你应该在聊天中询问 Godaddy 支持,日志文件所在的位置。
  • 是的,我可以上传其他文件。
猜你喜欢
  • 2018-03-18
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多