Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
1

Нужно ли уничтожать объекты после их использования?

16.02.2016, 12:38. Показов 1356. Ответов 6
Метки нет (Все метки)

Всегда считал, что после выполнения php скрипта, все его объекты (переменные, массивы и т.д.) уничтожаются и память освобождается.
Недавно обнаружив непонятный глюк с апачем, берущим и не отдающим назад память под выполнение скрипта, начал гуглить в поисках ответов.
Возможно, следует самому следить за памятью и всегда уничтожать объекты?

Все переменные unset, результаты запроса mysql_free_result и под конец unset($GLOBALS). И всё в этом духе...
PHP
1
2
3
4
5
6
7
8
$a='Текст';
//Действия
unset($a);
 
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
$row = mysql_fetch_assoc($result);
mysql_free_result($result);
echo $row['id'];
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2016, 12:38
Ответы с готовыми решениями:

DataReport. Нужно ли уничтожать его после использования?
Может ламерски прозвучит, но надо ли после использования репорта его уничтожать явно?? то есть...

Как уничтожать динамические объекты и вообще объекты, если это необходимо сделать в их процедурах?
Создать отдельную процедуру CloseObject(Object: TObject) и вызывать ее в конце процедуры или так...

Диалоги, нужно уничтожать ?
Намудрил с диалогами нужна помощь: @Override protected Dialog onCreateDialog(int id) {...

Нужно ли уничтожать экземпляр класса Vector?
Здравствуйте. В своей программе в функции использую класс vector (и даже vector <vector < >> =)...

6
Фрилансер
Эксперт JSЭксперт HTML/CSSЭксперт PHP
1840 / 1338 / 597
Регистрация: 12.01.2011
Сообщений: 5,394
16.02.2016, 12:44 2
Лучше почитайте про Mysqli или PDO.
0
1937 / 1764 / 824
Регистрация: 23.01.2014
Сообщений: 6,208
16.02.2016, 13:20 3
Цитата Сообщение от useruser Посмотреть сообщение
Нужно ли уничтожать объекты после их использования?
Так как Вы это представили - нет. Такие объекты сами очистятся после завершения работы скрипта.
Цитата Сообщение от useruser Посмотреть сообщение
Недавно обнаружив непонятный глюк с апачем, берущим и не отдающим назад память под выполнение скрипта,
Возможно скрипт запускает какие-либо сторонние процессы (за пределами самого скрипта), которые подвисают. Нужно подробно смотреть все процессы на этот момент на сервере. Нужно убедиться что php скрипт завершает свою работу корректно.
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
16.02.2016, 13:37  [ТС] 4
Цитата Сообщение от Azdeman Посмотреть сообщение
Лучше почитайте про Mysqli или PDO.
Почитал. А смысл? Да Mysqli пришел на смену Mysql. Но это не значит, что php+Mysql должны глючить.
Да, сейчас надо использовать Mysqli, это рекомендуют сами разработчики. Но прирост в основном в скорости.

Цитата Сообщение от pav1uxa Посмотреть сообщение
Возможно скрипт запускает какие-либо сторонние процессы (за пределами самого скрипта)
Мой скрипт включает в себя код (использует) PHPExcel. Что он делает - неизвестно.

Цитата Сообщение от pav1uxa Посмотреть сообщение
которые подвисают.
При перезапуске апатча вся память возвращается. Можно cronом перезапускать апач каждые 5 минут, но это не вариант.

Собственно код, если интересно
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//Обновление TABLE1
if ($handbook_name=='TABLE1' and $handbook_file_correct==1)
{
 
/** PHPExcel */
include 'addons/PHPExcel/PHPExcel.php';
/** PHPExcel_Writer_Excel2007 */
include 'addons/PHPExcel/PHPExcel/Writer/Excel2007.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set properties
$objPHPExcel->getProperties()->setCreator("User");
$objPHPExcel->getProperties()->setLastModifiedBy("User");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Document");
$objPHPExcel->getProperties()->setSubject("Report");
$objPHPExcel->getProperties()->setDescription("Document for Office 2007 XLSX.");
 
 
//Отчищаем таблицу
mysql_query("TRUNCATE TABLE TABLE1");
//mysql_query("SET AUTOCOMMIT=0") or die (mysql_error());
 
 
//Читаем файл построчно до конца и вставляем записи в базу
$current_string=''; //Текущая строка
$f=fopen($handbook_file_path, "r");
mysql_query("START TRANSACTION"); //Директива транзакции InnoDB - ускорение загрузки (важно!)
while(!feof($f)) 
{
 
$current_string=fgets($f);
//Преобразуем строку в кодировку UTF-8
$current_string = iconv("CP1251", "UTF-8", $current_string);
 
//Если строка содержит интересующие нас теги - осуществляем вставку записи в базу
//Поиск тегов GROUPMKB MKB DBEGIN DEND 
if (strripos($current_string,'GROUPMKB')!=0 and strripos($current_string,'MKB')!=0 and strripos($current_string,'DBEGIN')!=0 and strripos($current_string,'DEND')!=0)
{
 
//Отчищаем переменные. В случае, если мы не найдём тег в строке - мы вставим этот тег с пустым значением
$groupmkb_array[1]=''; $mkb_array[1]=''; $dbegin_array[1]=''; $dend_array[1]='';
 
//Создаем массив тега GROUPMKB
preg_match('# GROUPMKB="(.+?)"#is', $current_string, $groupmkb_array);
//Создаем массив тега MKB
preg_match('# MKB="(.+?)"#is', $current_string, $mkb_array);
//Создаем массив тега DBEGIN
preg_match('# DBEGIN="(.+?)"#is', $current_string, $dbegin_array);
//Создаем массив тега DEND
preg_match('# DEND="(.+?)"#is', $current_string, $dend_array);
 
//Создаем запись
mysql_query("INSERT INTO `TABLE1` (`GROUPMKB`,`MKB`,`DBEGIN`,`DEND`) VALUES 
('$groupmkb_array[1]','$mkb_array[1]','$dbegin_array[1]','$dend_array[1]')");
}
//Конец вставки
 
}
mysql_query("COMMIT"); //Директива транзакции InnoDB - ускорение загрузки (важно!)
 
//Закрываем и удаляем файл
fclose($f); unset($f); unlink($handbook_file_path);
 
//Оптимизация памяти - удаление не нужных объектов
unset($groupmkb_array); unset($mkb_array); unset($dbegin_array); unset($dend_array);
 
//Создание xml файла в папке handbook_files\<имя справочника>\ (исходный xml не соответствует стандарту)
if ($create_xml_files==1)
{
$path_to_file=$_SERVER['DOCUMENT_ROOT'].'/'.$sitedir."/handbook_files/TABLE1/TABLE1.xml";
$file = fopen ($path_to_file,"w"); //Открываем файл только для записи, если его нет - то создаем.
fwrite($file,'<?xml version="1.0" encoding="UTF-8"?>'."\n");
fwrite($file,'<!-- Этот файл представляет собой структуру базы TABLE1 в xml виде. -->'."\n");
fwrite($file,'<ROOT>'."\n");
$result = mysql_query("SELECT * FROM `TABLE1`");
$select_amt = mysql_num_rows($result);
for($select_amt; $select_amt>0; $select_amt--)
{$row=mysql_fetch_assoc($result);
$current_string='<REC GROUPMKB="'.$row[GROUPMKB].'" MKB="'.$row[MKB].'" DBEGIN="'.$row[DBEGIN].'" DEND="'.$row[DEND].'"/>';
fwrite( $file, $current_string."\n");}
fwrite($file,'</ROOT>');
fclose ($file); unset ($file);
create_random_string_file(TABLE1);
}
//Конец создания xml файла
 
 
//Оптимизация памяти - удаление не нужных объектов
unset($result); unset($row);
 
//Создание Excel файла в папке handbook_files\<имя справочника>\ (код не оптимизирован)
if ($create_xlsx_files==1)
{
$path_to_xlsx_file=$_SERVER['DOCUMENT_ROOT'].'/'.$sitedir."/handbook_files/TABLE1/TABLE1.xlsx";
 
//Заголовок
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0,1,'G1');
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1,1,'M1');
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(2,1,'D1');
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(3,1,'D2');
$result = mysql_query("SELECT * FROM `TABLE1`");
$select_amt = mysql_num_rows($result);
for($i=2; $i<$select_amt+2; $i++)
{
//Данные
$row=mysql_fetch_assoc($result);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0,$i,$row[G1]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1,$i,$row[M1]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(2,$i,$row[D1]);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(3,$i,$row[D2]);
}
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save($path_to_xlsx_file);
unset($objWriter);
}
//Конец создания excel файла
 
//Оптимизация памяти - удаление не нужных объектов
unset($GLOBALS);
 
//Выводим сообщение
header('Location:'.$path_to_root_dir.'admin/admin.php?show_message&handbook_loaded&name=TABLE1');
 
}
//Конец обновления TABLE1
0
161 / 161 / 65
Регистрация: 28.06.2015
Сообщений: 576
16.02.2016, 14:13 5
Цитата Сообщение от useruser Посмотреть сообщение
Недавно обнаружив непонятный глюк с апачем, берущим и не отдающим назад память под выполнение скрипта,
Возможно вобще уйти от апача, использовать php-fpm?
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,067
16.02.2016, 14:51  [ТС] 6
Цитата Сообщение от Xenox Посмотреть сообщение
Возможно вобще уйти от апача, использовать php-fpm?
Не знаю. Я плохо в этом разбираюсь, но у меня была такая идея. Надо много эксперементировать.
Лично мне всё равно какой веб-сервер. Главное поддержка основных библиотек.
Я хотел попробовать сделать всё тоже самое, но на lighttpd.
Я думаю, подойдет любой веб сервер, работающий с php и без утечек памяти. Апач неприятно удивил.
Теперь придётся его переустанавливать/удалять....неприятно вообщем
0
161 / 161 / 65
Регистрация: 28.06.2015
Сообщений: 576
16.02.2016, 15:04 7
Цитата Сообщение от useruser Посмотреть сообщение
Апач неприятно удивил.
Не знаю, я уже давно ушел от апача, имхо php-fpm быстрее и нажеднее, а на счет установки, не могу ничего сказать, т.к. не знаю какая у вас ось, лично у меня 15 убунта, и связка nginx + php5-fpm ставиться без проблем, так же как и настраивается, пробуйте
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2016, 15:04

Нужно ли явно уничтожать ADODataSet, ADOCommand и т.д.?
Добрый день! Я вот мучаюсь вопросом, нужно ли явно закрывать компоненты ADODataSet, ADOCommand и...

Нужно ли удалять массивы после их использования?
В общем вопрос в названии темы.

Не закрывать(уничтожать) объект после завершения функции
Использую GUIDE и пишу функцию обработчик. При этом созданные мною переменные не видны в...

Нужно ли уничтожать список Tstringlist отдельно с помощью StrList.Free?
Всем привет. Есть следующие вопросы. 1) если в программе создавfлся список Tstringlist, то при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.