Подготовленные операторы являются кэшируемой серверной стороной через несколько загрузок страницы с PHP?

Я узнал о подготовленных операторах при создании JDBC-поддерживающего JAVA-приложения, и мое приложение использует слой организации пула подключений, который уверяет меня, что подготовленные операторы являются кэшируемой серверной стороной, и это дает выигрыш в производительности.

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

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

  1. Будет использование PHP-FPM с mysqli, или PDO сохраняют соединения дольше, чем единственная загрузка страницы?
  2. Если это не делает, я могу сделать его?
  3. Если это сделает, или я делаю № 2, то это сохранит кэширование подготовленных операторов дольше, чем всего загрузка на одну страницу?

Править:

Просто для уточнения я не говорю о кэше запроса, который является другим зверем полностью или кэшированием вывода запросов. Я хочу кэшировать скомпилированный подготовленный оператор и его серверную сторону плана выполнения.

15
задан ZoFreX 11 January 2010 в 15:31
поделиться

7 ответов

При обслуживании запроса PHP «очищает» экземпляр и освобождает ресурсы и другие переменные. Это делается в нескольких шагах. Поскольку FastCGI сохраняет процесс вживую после запроса, не все шаги выполняются, а не вся память освобождается. Есть например Например, (persistente_list), который используется mysql_pconnect () , pg_pconnect () , ... Этот список не опорожняется между запросами до тех пор, пока процесс продолжает жить (может быть В зависимости от фактической реализации, но это бросит вызов цели, например, (persistentent_list)). Если вы используете постоянные соединения, ваш скрипт может получить соединение «повторно используемое», установленное во время предыдущего запроса.
Для (повторно) Используйте подготовленное выписку непосредственно вам нужен идентификатор для этого оператора (и это соединение). При использовании (PHP-) PostgreSQL Это просто (подключение-мудрый) уникальная строка, которую вы передаете в pg_execute () , поэтому ваш сценарий не имеет проблем, чтобы получить доступ к оператору, ранее подготовленному другому экземпляру то же самое связь).
Использование MySQLI или PDO-MySQL Вам нужен ресурс / объект в качестве идентификатора оператора. Это рода проблема, поскольку ни расширение MySQLI, ни расширение PDO, кажется, не предлагают способа сохранения ресурса в EG (Persist_List) между запросами, и вы также не можете воссоздать его. Если PHP-FPM не предлагает такого «сервиса», это кажется невозможным повторно использовать подготовленную заявку MySQL напрямую.
Все, что вы можете надеяться, это кэш запроса на стороне сервера MySQL . В последних версиях (см. Ссылка) может распознать утверждение при использовании подготовленных утверждений. Но даже тогда он не использует фактическое подготовленное утверждение:

для подготовленного оператора, выполняемого через двоичный протокол, сравнение с операторами в кэше запроса основано на тексте утверждения после расширения? Маркеры параметров . Заявление сравнивается только с другими кэшированными заявлениями, которые были выполнены через бинарный протокол. То есть для целей кэша запроса заявления, выпущенные через двоичный протокол, отличаются от операторов, выданных через текстовый протокол.

Итак, если я не ошибаюсь, в настоящее время вы не можете повторно использовать оператор MySQL, подготовленный во время предыдущего запроса в PHP.

12
ответ дан 1 December 2019 в 03:43
поделиться

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

Вам нужно посмотреть на документы для PHP-FPM и / или PDO, чтобы узнать, как сказать им объединение соединения. Там должен быть вариант в обоих, чтобы сделать это.

Вы должны знать, что настройки и разрыв подключения MySQL на самом деле на самом деле очень быстрые, и многие компоненты PHP не используют объединение соединения из-за этого. В любом случае, вы также должны вкладывать время в настройках вашего сервера, особенно PARMETER_TIMEOUT . PHP также разработан вокруг идеи, которую вы создаете все необходимое, когда ваши страницы начинаются, и все это уходит, когда страница заканчивается. Большинство PHP-кода и библиотеки предполагают, что это так. Это совсем другая парадигма, чем под Java.

2
ответ дан 1 December 2019 в 03:43
поделиться

Готовые заявления не имеют ничего общего с кэшированием результатов.

Кэшированием результатов можно управлять через конфигурацию сервера db или принудительно через memcached и тому подобное.

Предлагаю заглянуть в memcached, особенно для PHP http://www.php.net/manual/en/book.memcached.php

-1
ответ дан 1 December 2019 в 03:43
поделиться

Если вы используете Vim в окнах, то это будет работать:

:! start http://localhost/index.php

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

Из справки Vim cmd :

:! {cmd}

Выполните {cmd} с помощью снаряд. См. также «оболочка» и параметр «shelltype».

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

-121--3519700-

Используйте number-rows-spanned или number-column-spanned. Но почему бы не использовать визуальный дизайнер? Я использую Ecrion XF Designer и это довольно хорошая работа.

-121--1885360-

PHP в большинстве случаев не кэширует запросы и результаты запросов. MySQL будет выполнять этот вид кэширования независимо от того, какой поток или соединение выдает запрос.

Если требуется кэширование на стороне сервера между несколькими страницами или несколькими серверами, используйте кэширование запросов MySQL и кэширование на стороне сервера (APC, кэширование на основе файлов, memcached и т.д.).

-1
ответ дан 1 December 2019 в 03:43
поделиться

Вы путаете то, что происходит на уровне PHP/Java с тем, что происходит в базе данных.

Да, использование подготовленных операторов (обычно) означает, что план выполнения кэшируется самой БД (НЕ уровнем PHP/Java). Однако из этого не следует, что это всегда приводит к лучшей производительности - и объяснение этого заняло бы несколько сотен страниц. Однако, из того, что вы сказали в другом месте, я делаю вывод, что вы используете MySQL в качестве СУБД, что несколько упрощает обсуждение (IIRC ни один из движков хранилища не реализует гистограммы). Обычно MySQL способен кэшировать достаточно информации о схеме, чтобы иметь возможность генерировать план без дискового ввода/вывода. OTOH, использование подготовленных операторов означает не менее трех циклов обращения к СУБД для каждого запроса (настоящий оператор, настоящие параметры, получение результатов), в то время как использование подстрочных значений исключает эти циклы обращения к СУБД. При отсутствии индексов гистограмм значение переменных не имеет отношения к оптимальному плану, определяемому оптимизатором.

Тот факт, что вы используете PHP, или PHP-FPM, или Java с одиночными или постоянными или объединенными соединениями, не имеет значения, кэшируются ли в СУБД/переиспользуются ли файлы prepared-statements.

HTH

C.

4
ответ дан 1 December 2019 в 03:43
поделиться

Обратите внимание в этом контексте, что использование «self» является просто соглашением, метод просто использует первый аргумент в качестве ссылки на объект экземпляра:

class Example:
  def __init__(foo, a):
    foo.a = a
  def method(bar, b):
    print bar.a, b

e = Example('hello')
e.method('world')
-121--4268500-

Вот метод, который, на мой взгляд, вам нужен:

[x_p, y_p] = find (points); 

% convert the subscripts to indicies, but transposed into a row vector
a = sub2ind(size(im), x_p, y_p)';

% assign all the values in the image that correspond to the points to a value of zero
im([a]) = 0; 

% show the new image
imshow(im) 
-121--2938745-

вы можете заставить mysqli создать постоянное соединение, предваряя p: к имени хоста, согласно php doc: http://www.php.net/manual/en/mysqli.persistconns.php

Однако подготовленные инструкции всегда закрываются между загрузками страниц, как описано здесь: http://dev.mysql.com/doc/refman/5.0/en/apis-php-mysqli.persistconns.html

Извините, это не может быть сделано, насколько я знаю. Подготовленные инструкции предназначены для загрузки одной страницы.

2
ответ дан 1 December 2019 в 03:43
поделиться

Единственный верный ответ - это зависит от .

Когда дело доходит до MySQL, готовые операторы привередливы. Есть множество факторов, которые определяют, кэшируется ли подготовленный оператор.

Общая идея заключается в том, что если ваша версия <5.1.17, подготовленный оператор никогда не кэшируется в кеше запросов, а при использовании> = 5.1.17, это зависит .

См. Следующую страницу в руководстве по MySQL 5.1:

http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html

2
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: