пользовательский файл php.ini в подпапке, вызывающий проблемы с переменными $_SESSIONS

У меня есть подпапка с двумя файлами. Первый — это email.php с формой, с помощью которой пользователь может отправить мне электронное письмо. Он также имеет скрипт, похожий на капчу, для предотвращения спама и использует переменные $_SESSION[foo]. Второй — upload.php, который позволяет зарегистрированным пользователям загружать файлы. Оба файла работали нормально. Теперь мне нужно увеличить upload_max_filesize с базовых 2 МБ для upload.php. Мой хост не предоставляет доступ к основному php.ini, но рекомендует создать собственный файл php.ini в этой подпапке. Итак, я создал:

php.ini

upload_max_filesize = 10M ;
post_max_size = 10M ;

Теперь я получаю ошибки Warning: include() [function.include]: Filename cannot be empty и Warning: include() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php'), когда отправляю форму/капчу на email.php.

$_SESSION[foo]=$_GET[bar]; 
else  $_SESSION[foo]="foobar.php";
include($_SESSION['foo']); 

Я обнаружил, что $_SESSION[foo] пуст даже с else. После некоторых исследований я обнаружил, что когда я запускал phpinfo(), то session.save_path было no value (оригинал был /tmp). А сейчас

php.ini

upload_max_filesize = 10M ;
post_max_size = 10M ;
session.save_path = /home/foobar/tmp ;

Но я все еще получаю сообщение об ошибке. Если я удалю файл php.ini из этой папки, то скрипт формы на email.php будет работать нормально, но я вернусь к upload_max_filesize = 2 МБ для upload.php. Любая помощь будет оценена по достоинству.


person Sean    schedule 06.04.2011    source источник


Ответы (1)


Это проблема с настройками CGI PHP, где директивы сервера php.ini не каскадируются в пользовательские конфигурации.

Я много писал об этом здесь — http://blog.philipbrown.id.au/2009/08/php-suexec-and-custom-php-ini-files/


$_SESSION[foo]=$_GET[бар]; еще $_SESSION[foo]="foobar.php"; включить($_SESSION['foo']);

Я немного смущен этим фрагментом. Он не только недействителен (нет оператора if, индексы массива не указаны), но и крайне небезопасен.

person Phil    schedule 06.04.2011
comment
Я скопировал фрагмент и пропустил первую часть с оператором if и массивом, извините за ошибку. Я только что сделал работу cron, которую вы рекомендовали в своем блоге. Это сработало отлично, и теперь мой phpinfo() правильный, и обе страницы работают правильно. Спасибо. - person Sean; 06.04.2011
comment
@Sean Вы все еще слепо включаете файл на основе параметра запроса. Это никогда не лучшая идея - person Phil; 06.04.2011
comment
Я новичок, поэтому я ценю вашу помощь. Я унаследовал этот сценарий, так как взял на себя управление веб-сайтом некоммерческой организации. Вот скрипт с началом этого запроса if (is_file($_GET[bar]) and dirname($_GET[bar])=='.' ) $_SESSION[foo]=$_GET[bar]; else $_SESSION[foo]="foobar.php"; include($_SESSION[foo]); - person Sean; 06.04.2011
comment
@Sean Это выглядит немного лучше, но это по-прежнему прямая связь между параметром запроса и включенным файлом. Я бы рекомендовал поддерживать массив ключей для ассоциаций имен файлов. Параметр запроса может ссылаться на ключ, и вы используете его для поиска имени файла. - person Phil; 06.04.2011
comment
Есть ли лучший способ, не связанный с работой cron? - person Scott; 16.11.2013