为什么这个PHP脚本在一个子域而不是另一个相同的子域中工作


Why is this PHP script working in one subdomain and not another identical one?

我有一个php脚本,可以从与WordPress位于同一子域的csv文件("file.csv")创建WordPress帖子。这已经工作了几个月,但是,我刚刚将一个新的"file.csv"文件上传到几个子域,并且脚本不起作用,导致屏幕空白并且不会创建帖子。

为了排除故障,我检查了设置了 php 脚本的其他子域并上传了新的"file.csv"文件。它在那里工作。

因此,在某些子域

上,脚本可以工作,而在某些子域上则不能。WordPress安装是相同的。php脚本是相同的,我将其从一个域下载并上传到另一个域以进行故障排除。它适用于一个而不是另一个。我已经尝试了相同的"file.csv",仍然适用于一个子域而不是另一个子域。

错误

日志中出现以下错误

[2013 年 11 月 17 日 11:00:05] PHP 致命错误:第 16 行的/filepath/_adder.php 中允许的 134217728 字节的内存大小已耗尽(尝试分配 8388608 个字节)

但是,"file.csv"文件在两次安装中是相同的,并且大小相同。但它仍然适用于一个而不是另一个。

为什么脚本可能在完成的子域上正常工作,而不是在另一个子域上正常工作?任何建议,尝试的事情或提示将不胜感激。

为了完整起见,下面是有问题的 php 脚本。

<?php
require_once('wp-config.php');
$siteurl = get_site_url();

function clearer($str) {
  //$str = iconv("UTF-8", "UTF-8//IGNORE", $str);
  $str = utf8_encode($str);
  $str = str_replace("’", "'", $str);
  $str = str_replace("–", "-", $str);
  return htmlspecialchars($str);
}
//file read
if(file_exists("file.csv")) $csv_lines  = file("file.csv");
if(is_array($csv_lines)) {
  $cnt = 15;
  for($i = 0; $i < $cnt; $i++) {
    $line = $csv_lines[$i];
    $line = trim($line);
    $first_char = true;
    $col_num = 0;
    $length = strlen($line);
    for($b = 0; $b < $length; $b++) {
      if($skip_char != true) {
        $process = true;
        if($first_char == true) {
          if($line[$b] == '"') {
            $terminator = '",';
            $process = false;
          }else
            $terminator = ',';
          $first_char = false;
        }
        if($line[$b] == '"'){
          $next_char = $line[$b + 1];
          if($next_char == '"')
            $skip_char = true;
          elseif($next_char == ',') {
            if($terminator == '",') {
              $first_char = true;
              $process = false;
              $skip_char = true;
            }
          }
        }
        if($process == true){
          if($line[$b] == ',') {
             if($terminator == ',') {
                $first_char = true;
                $process = false;
             }
          }
        }
        if($process == true)
          $column .= $line[$b];
        if($b == ($length - 1)) {
          $first_char = true;
        }
        if($first_char == true) {
          $values[$i][$col_num] = $column;
          $column = '';
          $col_num++;
        }
      }
      else
        $skip_char = false;
    }
  }
  $values = array_values($values);
  //print_r($values);
  /*************************************************/
  if(is_array($values)) {
    //file.csv read
    for($i = 0; $i < count($values); $i++) {
      unset($post);
      //check duplicate
      //$wpdb->show_errors();
      $wpdb->query("SELECT `ID` FROM `" . $wpdb->prefix . "posts`
                            WHERE `post_title` = '".clearer($values[$i][0])."' AND `post_status` = 'publish'");
        //echo $wpdb->num_rows;
      if($values[$i][0] != "Name" && $values[$i][0] != "" && $wpdb->num_rows == 0) {
        $post['name'] = clearer($values[$i][0]);
        $post['Address'] = clearer($values[$i][1]);
        $post['City'] = clearer($values[$i][2]);
        $post['Categories'] = $values[$i][3];
        $post['Tags'] = $values[$i][4];
        $post['Top_image'] = $values[$i][5];
        $post['Body_text'] = clearer($values[$i][6]);
        //details
        for($k = 7; $k <= 56; $k++) {
          $values[$i][$k] != '' ? $post['details'] .= "<em>".clearer($values[$i][$k])."</em>'r'n" : '';
        }
        //cats
        $categoryes = explode(";", $post['Categories']);
        foreach($categoryes AS $category_name) {
          $term = term_exists($category_name, 'category');
          if (is_array($term)) {
            //category exist
            $cats[] = $term['term_id'];
          }else{
            //add category
            wp_insert_term( $category_name, 'category' );
            $term = term_exists($category_name, 'category');
            $cats[] = $term['term_id'];
          }
        }
        //top image
        if($post['Top_image'] != "") {
          $im_name = md5($post['Top_image']).'.jpg';
          $im = @imagecreatefromjpeg($post['Top_image']); 
          if ($im) {
            imagejpeg($im, ABSPATH.'images/'.$im_name);
            $post['topimage'] = '<img class="alignnone size-full" src="'.$siteurl.'/images/'.$im_name.'" alt="" />';
          }
        }
        //bottom images
        for($k = 57; $k <= 76; $k++) {
          if($values[$i][$k] != '') {
            $im_name = md5($values[$i][$k]).'.jpg';
            $im = @imagecreatefromjpeg($values[$i][$k]);
            if ($im) {
              imagejpeg($im, ABSPATH.'images/'.$im_name);
              $post['images'] .= '<a href="'.$siteurl.'/images/'.$im_name.'"><img class="alignnone size-full" 
src="'.$siteurl.'/images/'.$im_name.'" alt="" /></a>';
            }
          }
        }
        $post = array_map( 'stripslashes_deep', $post );
        //print_r($post);
        //post created
        $my_post = array (
           'post_title' => $post['name'],
           'post_content' => '
              <em>Address: '.$post['Address'].'</em>
              '.$post['topimage'].'
              '.$post['Body_text'].'
              <!--more-->
              '.$post['details'].'
              '.$post['images'].'
           ',
           'post_status' => 'publish',
           'post_author' => 1,
           'post_category' => $cats
        );
        unset($cats);
        //add post
        //echo "ID:" .
        $postid = wp_insert_post($my_post); //post ID
        //tags
        wp_set_post_tags( $postid, str_replace(';',',',$post['Tags']), true ); //tags
        echo $post['name']. ' - added. ';
        //google coords
        $address = preg_replace("!'((.*?)')!si", " ", $post['Address']).', '.$post['City'];
        $json = json_decode(file_get_contents('http://hicon.by/temp/googlegeo.php?address='.urlencode($address)));
        //print_r($json);
        if($json->status == "OK") {
          //нашло адрес
          $google['status'] = $json->status;
          $params = $json->results[0]->address_components;
          if(is_array($params)) {
            foreach($params AS $id => $p) {
              if($p->types[0] == 'locality') $google['locality_name'] = $p->short_name;
              if($p->types[0] == 'administrative_area_level_2') $google['sub_admin_code'] = $p->short_name;
              if($p->types[0] == 'administrative_area_level_1') $google['admin_code'] = $p->short_name;
              if($p->types[0] == 'country') $google['country_code'] = $p->short_name;
              if($p->types[0] == 'postal_code') $google['postal_code'] = $p->short_name;
            }
          }
          $google['address'] = $json->results[0]->formatted_address;
          $google['location']['lat'] = $json->results[0]->geometry->location->lat;
          $google['location']['lng'] = $json->results[0]->geometry->location->lng;
          //print_r($params);
          //print_r($google);
          //insert into DB
          $insert_code = $wpdb->insert( $wpdb->prefix . 'geo_mashup_locations',
                                        array( 'lat' => $google['location']['lat'], 'lng' => 
$google['location']['lng'], 'address' => $google['address'],
                                               'saved_name' => $post['name'], 'postal_code' => $google['postal_code'],
                                               'country_code' => $google['country_code'], 'admin_code' => 
$google['admin_code'],
                                               'sub_admin_code' => $google['sub_admin_code'], 'locality_name' => 
$google['locality_name'] ),
                                        array( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )
                                      );
          if($insert_code) {
            $google_code_id = $wpdb->insert_id;
            $geo_date = date( 'Y-m-d H:i:s' );
            $wpdb->insert(
              $wpdb->prefix . 'geo_mashup_location_relationships',
              array( 'object_name' => 'post', 'object_id' => $postid, 'location_id' => $google_code_id, 'geo_date' => 
$geo_date ),
              array( '%s', '%s', '%s', '%s' )
            );
          }else{
            //can't insert data
          }
          echo ' address added.<br />';
        }else{
          //echo $json->status;
        }
      }
    } //$values end (for)
  }
}else{
  //not found file.csv
  echo 'not found file.csv';
}
$input = explode("'n", file_get_contents("file.csv"));
foreach ($input as $line) {
 // process all lines.
}
// This function removes first $CNT elements.
// More info:
// http://php.net/manual/en/function.array-slice.php
$output = array_slice($input, $cnt);
file_put_contents("file.csv", implode("'n", $output));
?>
<html>
<body>
<form enctype="multipart/form-data" method="post">
 CSV: <input name="file" type="file" />
 <input type="submit" value="Send File" />
</form>
</body>
</html>

导入的文件大于服务器上允许的限制。您正在导入大量数据并存储在导致崩溃的内存中。有两种方法可以停止崩溃。

1.您可以将代码放在代码的顶部,然后再编写任何其他内容,从而提供更大的内存访问权限。

ini_set('memory_limit','256M');

2.您逐行读取文件并据此进行处理。

我的建议是选择第二种方式,建议有两个原因。

  1. 如果大小增加到超出保留文件内存的可能性,您将怎么做。要么你必须拆分它,要么选择第二个选项,所以你为什么不从第二个选项开始,而是在后期使用。

  2. 第二个原因是内存分配和执行速度。如果您采用第二个选项,则内存占用将更少,并且您的程序将比读取内存中的完整文件执行得更快,然后对其进行处理。