Используйте PHP для синхронизации больших объемов текста - PullRequest
0 голосов
/ 01 декабря 2009

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

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

$ downloadURL получает тонну информации из базы данных MySQL на нашем сервере и возвращает результаты в виде вывода на устройство. В настоящее время я возвращаю результаты в виде собственных операторов SQL (т. Е. Если я запрашиваю у базы данных «ВЫБРАТЬ имя из имен», я мог бы вернуть на устройство текстовую строку «ВСТАВИТЬ В ИМЯ SET SET names = 'JOHN SMITH'»). Он берет информацию из онлайн-базы данных и возвращает ее на устройство в виде оператора SQL, готового для вставки в базу данных ноутбука.

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

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

Ответы [ 4 ]

1 голос
/ 01 декабря 2009

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

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

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

0 голосов
/ 17 сентября 2013

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

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

Вот полный код для этой функциональности.

0 голосов
/ 01 декабря 2009

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

0 голосов
/ 01 декабря 2009

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

...