2009-12-01 4 views
0

У меня есть несколько ноутбуков в этой области, которые должны ежедневно получать информацию с нашего сервера. Каждый ноутбук имеет установку server2go (в основном Apache, PHP, MySQL работает как исполняемый файл), который запускает локальную веб-страницу. Веб-страница вызывает URL на сервере, используя следующий код:Использование PHP для синхронизации больших объемов текста

$handle = fopen($downloadURL , "rb"); 
$contents = stream_get_contents($handle); 
fclose($handle); 

$ downloadURL извлекает тонну информации из базы данных MySQL на нашем сервере и возвращает результаты в виде вывода на устройство. В настоящее время я возвращаю результаты как свои собственные операторы SQL (т. Е. - если я запрашиваю базу данных «SELECT name FROM names», я могу вернуть на устройство текстовую строку «INSERT INTO names SET names =« JOHN SMITH »). Это берет информацию из онлайновой базы данных и возвращает ее на устройство в инструкции SQL, готовой для вставки в базу данных ноутбука.

Проблема, с которой я сталкиваюсь, заключается в том, что объем данных слишком велик. На веб-странице ноутбука сохраняется время при получении информации с сервера. Я установил предельные значения тайм-аута PHP очень высокими, но все же столкнулся с проблемами. Может ли кто-нибудь подумать о лучшем способе сделать это? Будет ли stream_get_contents оставаться подключенным к серверу, если я сброшу данные на устройство в более мелкие куски?

Спасибо за любой ввод.

ответ

1

Что делать, если вы просто отправляете данные и генерируете sql на принимающей стороне? Это сэкономит вам много байтов для передачи.

Обновлено ли обновление данных? То есть можете ли вы просто отправить изменения со времени последнего обновления?

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

+0

Я тоже проголосовал за сжатие gzip ...возможно, немного SOAP webservice (чтобы вы могли иметь доступ к сеансу и ограничивать передачу, чтобы вы могли делать несколько запросов и получать ответ в кусках) – Catalin

0

Напишите сценарий, который компилирует текстовый файл из базы данных на сервере и загружает этот файл.

+0

Что это значит, что просто вернуть текст в выражении эха нет? Загружает ли браузер текстовый файл быстрее, чем веб-страница с помощью только текста? – Jonathon

+0

Ваша проблема, скорее всего, основана на текстовом файле, который относительно медленно создается из базы данных и, таким образом, достигает максимального времени выполнения для скриптов. Это только умножается, если несколько машин пытаются сделать это одновременно. Если вы создаете вывод на сервере в текстовый файл, вы можете обойти максимальное время выполнения, и вы должны делать это только один раз в день. – ty812

+0

@MartinHohenberg, это интересное решение для рассмотрения вопроса тайм-аута. – milesmeow

0

Возможно, вы захотите рассмотреть возможность использования сторонних служб синхронизации файлов, таких как Windows Live Sync или Dropbox, чтобы синхронизировать последний файл по всем машины. Затем у вас есть демон, который загружает файл в базу данных всякий раз, когда файл изменяется. Таким образом, вы избегаете иметь дело с частью синхронизации вообще.

0

Вы используете stream_get_contents (или вы даже можете использовать file_get_contents без дополнительной строки до потока open), но если количество текста действительно велико, как говорится в названии, вы пополните свою память.

Я пришел к этой проблеме при написании сценария для удаленного сервера, где память ограничена, так что это не сработает. Решение, которое я нашел, состояло в том, чтобы вместо этого использовать stream_copy_to_stream и скопировать файлы непосредственно на диск, а не в память.

Это complete code для этой части функциональности.