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


Why identical PHP script might work in one subdomain and not another?

我有一个php脚本,它从与WordPress位于同一子域的csv文件("file.csv")中创建WordPress帖子。这已经工作了几个月,然而,我刚刚上传了一个新的"file.csv"文件到几个子域,脚本不起作用,导致屏幕空白,无法创建帖子。

为了解决问题,我检查了其他子域,在那里我设置了php脚本,并上传了新的"file.csv"文件。它在那里起作用。

因此,在某些子域上,脚本是有效的,而在某些子域则不然。WordPress的安装是相同的。php脚本是相同的,我将它从一个域下载并上传到另一个域以进行故障排除。它对一个有效,对另一个无效。我尝试过相同的"file.csv",仍然在一个子域上工作,而不是在另一个子域。

以下错误出现在错误日志中

〔17-Nov-2013 11:00:05〕PHP致命错误:允许的内存大小134217728字节耗尽(试图分配8388608字节)在/filepath/_adder.PHP的第16行

但是,"file.csv"文件在两次安装中都是相同的,并且大小相同。但它仍然在其中一个中有效,而在另一个中无效。

为什么脚本可能在done子域上正常工作,而不是在其他子域上?任何建议、尝试或建议都将不胜感激。

为了完整起见,下面是有问题的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>

您的脚本可能使用了大量内存。我的客人可能正在将整个文件读取到数组中:

$csv_lines  = file("file.csv");

检查每台服务器上的内存限制。

var_dump(ini_get('memory_limit'));

在脚本运行的服务器上,该值应该高于出现错误的服务器上的值。

你可以尝试在你的导入文件上切割这个值

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

或者在您的.htaccess文件中(如果您的服务器使用apache)

php_value memory_limit 256M

最好的解决方案是重构导入脚本以降低内存消耗。