Вопрос
У меня есть сервер, на котором работает много клиентов, и когда я разрабатываю, я включаю свой init.php, в котором у меня есть __autoloader()
функция, которая включает файл с dir_name(__FILE__)."/classes/".$className
например.
Но вчера я увидел, что сервер не может найти конкретный класс, я перезапустил Apache, и тогда он снова заработал.
У каждого клиента есть свой init.php...(и, следовательно, множество __autoloads на одном сервере)
customer1/init.php : holds __autoload() customer1/classes/class.php customer2/init.php : holds __autoload() customer2/classes/class.php
Я не проводил некоторых тестов и надеюсь, что кто-нибудь сможет ответить на мой вопрос, прежде чем я попытаюсь воспроизвести проблему, но думаете ли вы, что php может использовать неправильную функцию автозагрузки, когда вы получаете 2 или более запросов одновременно?
Является ли spl_autoload_register решением?
Большое спасибо за идеи или мозговой штурм.
Решение
Я предполагаю, что у вас должна быть опечатка либо в одной из ваших функций __autoload(), либо вы включаете неправильный файл init.php.
Кроме того, dir_name() не существует, вам следует изменить его на имя каталога() вместо этого или вы также можете использовать новый НАПРАВЛЕНИЕ постоянный для того же эффекта, если вы используете PHP >= 5.3.
РЕДАКТИРОВАТЬ: В свете вашего комментария следует использовать:
require(realpath(dirname(__FILE__)) . '/classes/' . $className);
или
require(realpath(__DIR__) . '/classes/' . $className);
Другие советы
Каждый PHP-запрос совершенно отдельный, фактически невозможно иметь две функции с именами __autoload()
в одном и том же запросе PHP, поэтому они не могут вмешиваться.Возможные проблемы:
- Вы включаете не того клиента
init.php
- Вы забыли включить
init.php
файл, и в этом случае существует нет автозагрузка вообще.