Здесь использует всего одну команду без ЗАВИХРЕНИЯ. Супер простой.
echo file_get_contents('https://www.server.com', false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded",
'content' => http_build_query([
'key1' => 'Hello world!'
])
]
]));
Решение могло бы состоять в том, чтобы не использовать предложение limit, а вместо этого использовать соединение - объединение таблицы, используемой как некоторая последовательность.
Для получения дополнительной информации о SO, I нашел этот вопрос / ответ , который дает пример - который может вам помочь; -)
Прежде всего, если вы хотите разбить на страницы, вам обязательно нужно иметь предложение ORDER BY. Затем вам просто нужно использовать это предложение, чтобы глубже изучить свой набор данных. Например, рассмотрим следующее:
SELECT * FROM my_table ORDER BY id LIMIT 20
У вас будут первые 20 записей, допустим, их идентификаторы: 5,8,9, ..., 55,64. Ваша пагинационная ссылка на страницу 2 будет выглядеть как "list.php? Page = 2 & id = 64", а ваш запрос будет иметь вид
SELECT * FROM my_table WHERE id > 64 ORDER BY id LIMIT 20
Без смещения, прочитано только 20 записей. Это не позволяет вам произвольно переходить на любую страницу, но в большинстве случаев люди просто просматривают следующую / предыдущую страницу. Индекс на «id» улучшит производительность даже при больших значениях OFFSET.
В основном есть 3 подхода к этому, каждый из которых имеет свои собственные компромиссы:
Отправить все 10000 записей клиенту и обрабатывать пагинацию на стороне клиента с помощью Javascript или тому подобного. . Очевидное преимущество состоит в том, что для всех записей необходим только один запрос; очевидным недостатком является то, что если размер записи в какой-либо мере значительный, размер страницы, отправляемой в браузер, будет пропорциональным, и пользователю может быть не важен полный набор записей.
Делайте то, что вы в настоящее время выполняется, а именно SQL LIMIT, и захватывать только те записи, которые вам нужны, с каждым запросом, полностью без сохранения состояния. Преимущество в том, что он отправляет записи только для запрашиваемой в данный момент страницы, поэтому запросы небольшие, а недостатки в том, что: а) требуется запрос сервера для каждой страницы и б) это ' s медленнее по мере увеличения количества записей / страниц для последующих страниц в результате, как вы упомянули. Использование предложения JOIN или WHERE в монотонно увеличивающемся поле id иногда может помочь в этом отношении, особенно если вы запрашиваете результаты из статической таблицы, а не из динамического запроса.
Поддерживайте какой-то объект состояния на сервере который кэширует результаты запроса и может использоваться в будущих запросах в течение ограниченного периода времени. Плюс в том, что у него лучшая скорость запроса, поскольку фактический запрос должен выполняться только один раз; Обратной стороной является необходимость управлять / хранить / очищать эти объекты состояния (особенно неприятно для веб-сайтов с высоким трафиком).
Я не знаю о том снижении производительности, о котором вы упомянули, и я не знаю другого решения для разбивки на страницы, однако предложение ORDER BY может помочь вам сократить время загрузки.
некоторые другие параметры,
Лучший способ - определить поле индекса в my_table и для каждой новой вставленной строки вам нужно увеличивать это поле. И в конце концов вам нужно использовать WHERE YOUR_INDEX_FIELD BETWEEN 10000 И 10020 Это будет намного быстрее.