Php нужно ли удалять объект

Нужно ли мне выпустить объект на php?

Раньше я использовал Objective-C в разработке для iPhone. Кажется, мне нужно поработать на внутреннем сайте, для этого я выбрал PHP. В Objective-C мне нужно освобождать объекты после того, как я их использую. Нужно ли мне делать это и в PHP? Спасибо.

4 ответа

В 99,9% случаев нет необходимости удалять объект. В PHP есть сборщик мусора, который сделает это за вас. Сборщик мусора освободит данный экземпляр памяти, если он больше не нужен в вашем коде.

Вы не за исключением постоянных подключений к базе данных.

Не для памяти, PHP использует сборку мусора. Объекты освобождаются в какой-то момент после того, как они становятся недоступными ( не мгновенно, как утверждают некоторые упрощенные введения) для вашего кода. Это включает в себя циклы ссылок, поскольку в некоторых версиях (a ссылки b, b ссылки a) раньше использовался только подсчет ссылок, и поэтому такие циклы терпели неудачу.

Ресурсы (файлы, соединения с базой данных и т. Д.) Могут быть закрыты, когда они собираются, но поскольку время сбора не является детерминированным и закрывает ли это их зависит от рассматриваемого ресурса, вероятно, очень плохая идея просто оставьте их, когда закончите с ними.

Нет, вы этого не сделаете! Php имеет сборщик мусора, который позаботится об обработке памяти за вас.

Я очень сомневаюсь, что unset вызовет разрушение. Даже если он запускает цикл GC (опять же, очень неправдоподобно), ни один известный мне язык GC не позволяет (кроме D, где GC является явно необязательным) удалять объект, когда на него все еще ссылаются, поскольку это уничтожит 50% того, что делает GC полезным (без висячих указателей).

Читайте также:  Html code powered by

Вероятно, unset() не освобождает память немедленно, так как отправит сообщение [myObj release]. Но это самое близкое к выпуску сообщение, которое я знаю в PHP.

Дело в том, что ни в одном чисто GC-языке такого нет. Даже не что-то близкое. Говорить людям, что это близко к этому, вероятно, вредно (они, вероятно, будут спамить это и делать свой код нечитаемым), говоря им, что это именно то, что (как и вы) это просто неправильно.

Ты прав! Такое заявление может сбить с толку незнакомого пользователя и может привести к распространению порочной практики. Я отредактирую свой ответ, чтобы избежать недоразумений в будущем.

Источник

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

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

Все переменные unset, результаты запроса mysql_free_result и под конец unset($GLOBALS). И всё в этом духе.

$a='Текст'; //Действия unset($a); $result = mysql_query("SELECT id,email FROM people WHERE "); $row = mysql_fetch_assoc($result); mysql_free_result($result); echo $row['id'];

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

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

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

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

Эксперт JSЭксперт HTML/CSSЭксперт PHP

ЦитатаСообщение от useruser Посмотреть сообщение

ЦитатаСообщение от useruser Посмотреть сообщение

Недавно обнаружив непонятный глюк с апачем, берущим и не отдающим назад память под выполнение скрипта,

Возможно скрипт запускает какие-либо сторонние процессы (за пределами самого скрипта), которые подвисают. Нужно подробно смотреть все процессы на этот момент на сервере. Нужно убедиться что php скрипт завершает свою работу корректно.

ЦитатаСообщение от Azdeman Посмотреть сообщение

Почитал. А смысл? Да Mysqli пришел на смену Mysql. Но это не значит, что php+Mysql должны глючить.
Да, сейчас надо использовать Mysqli, это рекомендуют сами разработчики. Но прирост в основном в скорости.

ЦитатаСообщение от pav1uxa Посмотреть сообщение

Мой скрипт включает в себя код (использует) PHPExcel. Что он делает — неизвестно.

ЦитатаСообщение от pav1uxa Посмотреть сообщение

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

Собственно код, если интересно

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,''."\n"); fwrite($file,''."\n"); $result = mysql_query("SELECT * FROM `TABLE1`"); $select_amt = mysql_num_rows($result); for($select_amt; $select_amt>0; $select_amt--) '; fwrite( $file, $current_string."\n");> fwrite($file,''); 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; $igetActiveSheet()->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

Источник

How to destroy an object?

It will stay there, however if you unset the object and your script pushes PHP to the memory limits the objects not needed will be garbage collected. I would go with unset() (as opposed to setting it to null) as it seems to have better performance (not tested but documented on one of the comments from the PHP official manual).

That said, do keep in mind that PHP always destroys the objects as soon as the page is served. So this should only be needed on really long loops and/or heavy intensive pages.

So Frankie, I come from C++, where when we use new once, then we must use delete once. This is not true in PHP? There is automatic garbage collection when the object is no longer needed?

@gsamaras that’s true. You can also have leaks, though, and you should read more on php’s GC if you’re doing daemons or similar. In the majority of sites the request is so short lived that it doesn’t matter. php.net/manual/en/features.gc.refcounting-basics.php

does this answere still stand in 2021? it is needed for UnitTesting, a concept not really far spread in 2012 i assume

unset might be useful for background CLI workers which normally stay active in background until they are explicitly terminated or restarted.

A handy post explaining several mis-understandings about this:

This covers several misconceptions about how the destructor works. Calling it explicitly will not actually destroy your variable, according to the PHP5 doc:

PHP 5 introduces a destructor concept similar to that of other object-oriented languages, such as C++. The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence.

The post above does state that setting the variable to null can work in some cases, as long as nothing else is pointing to the allocated memory.

Short answer: Both are needed.

I feel like the right answer was given but minimally. Yeah generally unset() is best for «speed», but if you want to reclaim memory immediately (at the cost of CPU) should want to use null.

Like others mentioned, setting to null doesn’t mean everything is reclaimed, you can have shared memory (uncloned) objects that will prevent destruction of the object. Moreover, like others have said, you can’t «destroy» the objects explicitly anyway so you shouldn’t try to do it anyway.

You will need to figure out which is best for you. Also you can use __destruct() for an object which will be called on unset or null but it should be used carefully and like others said, never be called directly!

Источник

Оцените статью