Почему идентичный PHP-скрипт может работать в одном поддомене, а не в другом?

У меня есть 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» идентичен в обеих установках и имеет тот же размер. Но он все еще работает в одном, а не в другом.

Почему скрипт может работать корректно на субдомене, а не на другом? Любые предложения, вещи, которые нужно попробовать или советы, будут очень оценены.

Для полноты ниже приведен скрипт 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( 'Ymd 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 

Лучшим решением было бы рефакторинг вашего сценария импорта для снижения потребления памяти.