У вас есть две проблемы здесь:
# 1, есть несколько различных способов вычисления хеша MD5:
- Делайте как вы, загружайте в PHP как строку и используйте PHP
md5()
- Использовать PHP
md5_file()
- Начиная с PHP 5.1+, вы можете использовать API потоков PHP с
md5
или md5_file
, чтобы избежать полной загрузки в память
- Используйте
exec()
для вызова системной md5sum
команды
- Используйте функцию MySQL
MD5()
для вычисления хеша
Поскольку реализовать их все тривиально, вам будет легко внедрить и сравнить их все по использованию памяти и скорости. Вот некоторые тесты , показывающие, что система md5 через exec
намного быстрее, чем PHP md5_file
, с увеличением размера файла. Делать это по-своему - определенно худший способ использования памяти.
# 2, mysql_real_escape_string
выполняет запрос к базе данных, так что вы фактически передаете данные BLOB-объектов в базу данных, возвращаете их в виде строки и передаете их снова (!) С помощью запроса INSERT. Таким образом, он перемещается на / с сервера БД 3x вместо 1x и использует 2x памяти в PHP.
Будет эффективнее использовать подготовленные PHP5 операторы и отправлять эти данные в базу данных только один раз. Прочтите раздел связанной статьи, и вы увидите, что когда вы связываете параметры, вы можете использовать тип BLOB-объектов для потоковой передачи данных BLOB-блоков в БД. Документы PHP для mysqli_stmt::send_long_data
имеют отличный простой пример того, как ВСТАВИТЬ файл в столбец BLOB-объектов, как вы.
Делая это, и используя API потоков, md5_file
или exec
с системной командой md5, вы можете выполнить весь INSERT, не загружая весь файл в память, что означает использование памяти для вашей серии операций может быть так низко, как вы хотите!