посмотрите на /etc/php.ini
, там:
; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
; http://www.php.net/manual/en/ini.sect.safe-mode.php#ini.disable-functions
disable_functions =
убедитесь, что exec не указан в следующем виде:
disable_functions=exec
Если это так, удалите его и перезагрузите apache.
Для легкой отладки я обычно обычно запускаю файл php вручную (может запрашивать больше ошибок, не устанавливая его в основном ini). для этого добавьте заголовок:
#!/usr/bin/php
ini_set("display_errors", 1);
ini_set("track_errors", 1);
ini_set("html_errors", 1);
error_reporting(E_ALL);
в начало файла, дайте ему разрешения с помощью chmod +x myscript.php
и выполните его ./myscript.php
. Он очень внимателен, особенно на занятом сервере, который много пишет в файле журнала.
EDIT
Звучит как проблема с разрешениями. Создайте сценарий bash, который делает что-то простое как echo "helo world"
и попытается запустить его. Убедитесь, что у вас есть разрешения для файла и папки, содержащей файл. вы можете просто сделать chmod 755
только для тестирования.
Что вам не хватает, так это то, что hash.update()
не заменяет хешированные данные. Вы постоянно обновляете хэш-объект, так что вы получаете хэш из конкатенированных строк . Из документации hashlib.hash.update()
:
Обновите хэш-объект со строкой arg . Повторные вызовы эквивалентны одному вызову с конкатенацией всех аргументов:
blockquote>m.update(a)
;m.update(b)
эквивалентенm.update(a+b)
.Смелый акцент мой.
Итак, вы не получаете хеш одной строки
'stackoverflow'
, вы получаете хэш сначала из'stackoverflow'
, затем из'stackoverflowstackoverflow'
, затем'stackoverflowstackoverflowstackoverflow'
и т. д., каждый раз, когда добавляет другой'stackoverflow'
, создавая более длинную и длинную строку. Ни одна из этих более длинных строк не равна исходной короткой строке, поэтому их хэши вряд ли будут одинаковыми.Создайте новый объект new для новых строк:
>>> import hashlib >>> m = hashlib.md5() >>> m.update('stack' + 'overflow') >>> m.hexdigest() '73868cb1848a216984dca1b6b0ee37bc' >>> m = hashlib.md5() # **new** hash object >>> m.update('stackoverflow') >>> m.hexdigest() '73868cb1848a216984dca1b6b0ee37bc' >>> m = hashlib.md5() # new object again >>> m.update('stack') # add the string in pieces, part 1 >>> m.update('overflow') # and part 2 >>> m.hexdigest() '73868cb1848a216984dca1b6b0ee37bc'
Вы можете легко создать свои «неправильные» хэши, отправив в конкатенированные данные:
>>> m = hashlib.md5() >>> m.update('stackoverflowstackoverflow') >>> m.hexdigest() '458b7358b9e0c3f561957b96e543c5a8' >>> m = hashlib.md5() >>> m.update('stackoverflowstackoverflowstackoverflow') >>> m.hexdigest() '65b0e62d4ff2d91e111ecc8f27f0e8f5' >>> m = hashlib.md5() >>> m.update('stackoverflow' * 4) >>> m.hexdigest() '60c3ae3dd9a2095340b2e024194bad3c'
Обратите внимание, что вы также можете передать первую строку в функцию
md5()
:>>> hashlib.md5('stackoverflow').hexdigest() '73868cb1848a216984dca1b6b0ee37bc'
Обычно вы используете метод
hash.update()
, только если вы обрабатываете данные в кусках (например, чтение строки по строке или чтение блоков данных из сокета) и не хотите, чтобы для одновременного хранения всех этих данных в памяти.