2010-05-14 3 views
0

Я пытаюсь разобрать 6000 строк 500 КБ файла в массив, чтобы я мог импортировать данные в нашу систему. Проблема в том, что скрипт перестает выполняться где-то между строками 3000-4000. В коде нет разрывов, мы используем его для других импортных товаров. Любые идеи о том, почему это может происходить и что я могу сделать, чтобы предотвратить это?Скрипт умирает, я не уверен, почему

/** 
* Takes a seperated value string and makes it an array 
* @param $delimiter string The delimiter to be seperated by, usually a comma or tab 
* @param $string string The string to seperate 
* @return array The resulting array 
*/ 
public function svToArray ($delimiter, $string) { 
    $x = 0; 
    $rowList = array(); 
    $splitContent = preg_split("#\n+#", trim($string)); 
    foreach ($splitContent as $key => $value) { 
     $newData = preg_split("#".$delimiter."#", $value); 
     if ($x == 0) { 
      $headerValues = array_values($newData); 
     } else { 
      $tempRow = array(); 
      foreach ($newData as $rowColumnKey => $rowColumnValue) {             
       $tempRow[$headerValues[$rowColumnKey]] = $rowColumnValue; 
      } 
      $rowList[] = $tempRow; 
     } 
     $x++; 
    } 
    return $rowList; 
} 

UPDATE: Сообщения об ошибках включен. Я начал использовать файл, который только 130KB в 1500 строк, и он делает то же самое ...

Когда я добавляю отладки кода, как в следующем примере ничего перекликается вообще, пока я не положил выход после echo "test<br/>";

public function svToArray ($delimiter, $string) { 
    $x = 0; 
    $rowList = array(); 
    $splitContent = preg_split("#\n+#", trim($string)); 
    echo "test<br/>"; 
    foreach ($splitContent as $key => $value) { 
     $newData = preg_split("#".$delimiter."#", $value); 
     if ($x == 0) { 
      $headerValues = array_values($newData); 
     } else { 
      $tempRow = array(); 
      foreach ($newData as $rowColumnKey => $rowColumnValue) {             
       $tempRow[$headerValues[$rowColumnKey]] = $rowColumnValue; 
      } 
      $rowList[] = $tempRow; 
     } 
     $x++; 
    } 
    echo "test"; 
    $this->tru->debug($rowList); 
    exit; 
    return $rowList; 
} 

UPDATE Если я закомментировать $tempRow[] = $rowColumnValue; то перекликается все прекрасное ....

+2

Что такое сообщение об ошибке? Включены ли сообщения об ошибках? –

+0

Какая ошибка? убедитесь, что display_errors включен, а error_reporting - E_ALL. – AlfaTeK

+0

Вы пробовали свой код с другим (возможно, меньшим) файлом? – nico

ответ

0

Похоже, что там было слишком много в выходной буфер, в результате чего страница не показывать ничего.

1

Вероятно, это просто тайм-аута. Всегда ли это происходит после X секунд?

Попробуйте установить максимальное время выполнения выше: set_time_limit (900) в верхней части ваших страниц.

Вы можете проверить максимальное время выполнения в вашей phpinfo(): 1. Создайте новую страницу PHP с 2. Поиском max_execution_time

+0

Он загружается почти мгновенно ... Я пытаюсь теперь с файлом размером 130 КБ, и он не работает. – Webnet

+0

@Webnet - Тайм-аут сценария является общим количеством времени, сценарий должен работать, то есть время, чтобы загрузить файл, разобрать записи и подготовить и отправить ответ клиенту. Вы уверены, что не отключаете этот предел? – Paolo

+0

100% положительный. Скрипт полностью загружается и заканчивается в течение 3-5 секунд. Он также не выводит ничего, что отражается. Что может помешать отображению вывода на странице? – Webnet

0

Вы смотрели на файлах? Есть ли линия со слишком большим количеством разделителей? Кроме того, что все «#»?

Мое лучшее предположение, что вы попадаете в линию, где $headerValues[$rowColumnKey] не определен.

0

Как насчет $ rowColumnKey и $ rowColumnValue?

Данные функции не определены.

0

Вы уверены, что выполняете итерацию через возвращаемый массив вместо того, чтобы просто пытаться его распечатать? (Проблема может быть вне этой функции, а не внутри него.)

Также ...

`exit; 
return $rowList;` 

Попробуйте удалить «выход;» и посмотрите, не изменит ли это что-либо.

Кроме того, $ splitContent не используется как массив перед использованием, но preg_split собирается вернуть массив. (Это не должно влиять на ваши результаты, но это безопасно.)

Почему вы используете пары $ key => $ value, если вы не можете быть уверены в том, что будет внутри строки? Если бы мы могли увидеть небольшой пример содержимого строки $, мы могли бы настроить эту функцию для лучшей работы.

# следует заменить на /, но это может быть просто проблема форматирования.

$ newData должен быть определен как массив, прежде чем использоваться только для того, чтобы быть в безопасности, даже если это не вызывает проблемы.

0

Убедитесь, что у вас есть ошибки набор отчетов, поставить это на верхней части файла PHP:

ini_set('display_errors', true); 
error_reporting(E_ALL); 

Также вы можете продлить время выполнения скрипта:

ini_set('max_execution_time', 50000); 
0

О единственный раз, когда я 'php скрипт умирает, без вывода и ошибок нет, когда заканчивается память. Это не похоже, что ваш скрипт будет использовать много памяти, но я бы проверял, чтобы ограничение памяти для php было достаточно высоким.

0

Если вы можете увеличить максимальное время выполнения в php.ini .. также увеличить максимальный объем памяти для каждого экземпляра .. проверка журналов ошибок вашего веб-сервера может также помочь.

Смежные вопросы