mysqli_free_result необходимо?

Я просматривал свой код и читал, что было рекомендовано использовать mysqli_free_result когда ваш объект результата больше не нужен. Но, увидев, что каждый запрос выводится в переменную $result неоднократно по всему сценарию, мне интересно, действительно ли mysqli_free_result будет необходимо. Кажется, что каждый раз, когда выполняется запрос, переменная $result уже очищается и устанавливается на новый результат. Просто любопытно, есть ли у кого-нибудь какие-либо данные по этому поводу.

Ответ 1

На самом деле это необходимо, потому что это может сделать большую нагрузку на сервер, когда сделано много запросов. Поэтому желательно использовать его.

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

Ответ 2

Его никогда не нужно строго, но хорошая практика - следить за ресурсами, которые вы используете, и знать, когда они вам больше не нужны.

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

Ответ 3

Это загромождает код. Это не основанная на функциональности причина отказа от mysqli_free_result, но, на мой взгляд, действительная причина. Рассмотрим фрагмент ниже.

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

Еще одной причиной освобождения этих ресурсов будет ограничение на уровне ОС на количество открытых дескрипторов файлов. Тем не менее, я думаю, что все запросы проходят через это одно соединение или один дескриптор файла или сокет.


 // Share PDF
 if ($_REQUEST['do'] == 'sharePDF') {
-   $sql = "SELECT * FROM c_document WHERE doc_id = $doc_id";
-   $res = mysql_query($sql);
-   $doc_row = mysql_fetch_assoc($res);
-   mysql_free_result($res);
-   $d_name = $doc_row['d_name'];
-   $templ_id = $doc_row['templ_id'];
-   $sql = "SELECT * FROM c_template WHERE templ_id = $templ_id";
-   $res = mysql_query($sql);
-   $templ_row = mysql_fetch_assoc($res);
-   mysql_free_result($res);
+
+   $doc_row = qAssocOne("SELECT * FROM c_document WHERE doc_id = $doc_id");
+   $templ_row = qAssocOne("SELECT * FROM c_template WHERE templ_id = {$doc_row['templ_id']}") ;
+
    $params = array(
        'share_pdf_core_id='.$templ_row['share_pdf_core_id'],
        'share_pdf_create_id='.$templ_row['share_pdf_create_id'],
@@ -193,7 +187,7 @@ if ($_REQUEST['do'] == 'sharePDF') {
        'doc_id='.intval($_REQUEST['doc_id']),
        'pdf1='.urlencode($_REQUEST['pdf']),
        'pdf2=',
-       'name='.urlencode($d_name),
+       'name='.urlencode($doc_row['d_name']),
        'select_output='.$templ_row['select_output']
     );
    $params = join("&",$params);

По-моему, вычитаемые линии - абсолютный мусор; десять строк против двух. Пожалуйста...


В ответ на комментарий от вашего здравого смысла:

Никто не должен заботиться о том, что делает функция. Это иллюстрирует точку. Кроме того, название дает вам подсказки. Q для запроса, Assoc для выборки (гидрата) хеша, а не числового массива. One для одной записи, а не набор записей. Если вы действительно не можете догадаться, что он делает, выполните поиск в Интернете. Код доступен. Сначала нажмите на google.

Это не связано. Много PHP-кода выглядит так. Моя точка указана в ответе. Это необязательно, потому что очистка набора результатов с одной строкой не спасет вас много памяти. Это необязательно, потому что он загромождает код и запутывает намерение или бизнес-логику.

приятного дня