Why identical PHP script might work in one subdoma

2020-05-07 08:51发布

问题:

I have a php script that creates WordPress posts from a csv file ("file.csv") that is on the same subdomain as WordPress. This has been working for months, however, I just uploaded a new "file.csv" file to a couple of subdomains and the script is not working, resulting in a blank screen and does not create posts.

To troubleshoot, I checked other subdomains where I have the php script set up and uploaded the new "file.csv" file. It worked there.

So, on some subdomains the script is working and on some it is not. The WordPress installs are identical. The php script is identical, I downloaded and uploaded it from one domain to the other to troubleshoot. It works on one and not the other. I have tried identical "file.csv", still works on one subdomain and not the other.

The below error comes up in the error logs

[17-Nov-2013 11:00:05] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8388608 bytes) in /filepath/_adder.php on line 16

However the "file.csv" file is identical in both installs, and is the same size. But it still works in one and not the other.

Why might the script be working correctly on done subdomain and not the other? Any suggestions, things to try or tips would be very much appreciated.

For sake of completeness, below is the php script in question.

<?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:

Your script is probably using a lot of memory. My guest on cause whould be reading whole file to array with:

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

Check memory limit on each server.

var_dump(ini_get('memory_limit'));

On server that script works this value should be higher then on servers that you have your error.

You can try to incise this value on top of your import file

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

Or in your .htaccess file (if your server using apache)

php_value memory_limit 256M

Best solution would be to refactor your import script to lower memory consumption.