У меня есть сценарий, и я не знаю, почему и как он работает - одна из причин этого - я нашел противоречивую информацию о file_get_contents
.
У меня есть три (внутренних) webservers - все настроено одинаково, запустив одно и то же программное обеспечение. Мне нужно подсчитать количество файлов в одной конкретной папке на каждом сервере (чтобы получить количество пользователей, зарегистрированных в определенном приложении).
Для локального сервера мой файл, подсчитывающий PHP-скрипт, вызывается простым include
а для двух удаленных серверов я использую file_get_contents
. В обоих случаях я ссылаюсь на один и тот же файл PHP. Это работает - я получаю правильное количество файлов для папки на каждом сервере.
Иногда вы читаете file_get_contents
возвращает только содержимое файла, но не выполняет файл. В моем случае файл выполняется, и я получаю правильное количество файлов. Итак, я немного смущен, почему мои скрипты действительно работают.
Мои сценарии были сохранены на одном сервере. Я хочу быть более гибким и иметь возможность вызывать скрипты с каждого сервера. Поэтому я создал новый виртуальный каталог в сетевой папке и переместил туда файлы сценариев, виртуальная папка имеет одинаковые настройки на каждом сервере. Мне пришлось немного изменить свой сценарий, чтобы снова получить тот же результат. Вместо return $num
меня теперь есть echo $num
. Если я использую return
я не получу результат, если я использую echo
указано правильное количество файлов. Я бы предпочел получить результат через return
- но я не знаю, почему это больше не работает в новом контексте.
скрипт, который показывает количество файлов:
function getUserNum($basis_url_server, $url_vaw_scripte, $script_number_users)
{
$serverName = strtoupper($_SERVER['SERVER_NAME']);
//local server
if(strpos(strtoupper($basis_url_server),$serverName) !== false)
{
$numUsers = (include($script_number_users));
}
//remote server
else
{
$path = $basis_url_server.$url_vaw_scripte.$script_number_users;
$numUsers = file_get_contents($path);
//include($path);
}
return $numUsers;
}
echo getUserNum($basis_url_server1, $url_vaw_scripte, $script_number_users)."($label_server1)";
echo getUserNum($basis_url_server2, $url_vaw_scripte, $script_number_users)."($label_server2)";
echo getUserNum($basis_url_server3, $url_vaw_scripte, $script_number_users)."($label_server3)";
скрипт для подсчета файлов ($script_number_users
выше $script_number_users
)
<?php
// 'include' only contains $fadSessionRepository = "E:\Repository\Session"
include dirname(__DIR__).'/vaw_settings.php';
$fi = new FilesystemIterator($pfadSessionRepository, FilesystemIterator::SKIP_DOTS);
$number = (iterator_count($fi)-1)/2 ;
//return $number;
echo $number;
?>
file_get_contents() выполнит GET, если ему задан url, и прочитает файл, если задан путь к файловой системе. Это похоже на 2 разные функции от одного и того же вызова. Фактически вы создаете примитивный веб-сервис REST вместо фактической загрузки файлов, как вы, удаленные файлы выполняются, и вы получаете вывод, который вы увидите, если вы вручную загрузили их из браузера
file_get_contents()
вернет исходное содержимое локального файла. Для удаленных файлов он вернет то, что обеспечивает веб-сервер. Если веб-сервер выполнит скрипт в файле, он получит результат этого скрипта. Если веб-сервер не выполняет сценарий в файле (из-за неправильной конфигурации, например), вы все равно получите исходный контент удаленного сценария.
В вашем случае я просто удаляю путь include и просто извлекаю все скрипты через http. Это уменьшает сложность, и накладные расходы при вызове одного из трех скриптов через HTTP вместо его загрузки незначительны.