Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Магия php сводит меня с ума (помогите отловить глюк)
Новая тема
Ответить
цитата
12/01/18 в 21:33
mx-user
<?php
namespace Controller;
class Controller {
function action_index() {
echo 'ЭТО ЗАПУСКАЕТСЯ, А НЕ ДОЛЖНО (и не выводится) ';
$user = $this->get_user();
}
function get_user() {
$user_collection = new \Model\User();
if (isset($_COOKIE['uid'])) {
$uid = $_COOKIE['uid'];
$user = $user_collection->getById($uid);
} else {
$uid = uniqid();
echo 'ЭТО НЕ ВЫВОДИТСЯ, НО '
. 'ВСТАВКА В БАЗУ И УСТАНОВКА КУК ПРОИЗВОДЯТСЯ';
$user_collection->insert($uid);
setcookie('uid', $uid, time() + 60 * 60 * 24, '/');
}
}
function action_check_cookie() {
echo 'ЭТО ВЫВОДИТСЯ, И ПОЧЕМУ-ТО ПРОИСХОДИТ ЗАПУСК action_index';
}
}
Запускаю через браузер action_check_cookie и начинается магия... Ставятся куки, производится вставка в базу, а вот вывод echo не происходит. В index.php и \Model\User ничего такого нет...
Помогите разобраться с этой гадостью, а то мне уже больно 8)
Посоветуйте, как понять что происходит? Может какой трассировщик есть?
P.S. Если закомментировать $user = $this->get_user(); то все нормально. Получается, каким-то чудом вызывается action_index, но как?
Последний раз редактировалось: mx-user (
12/01/18 в 22:02
), всего редактировалось 1 раз
цитата
12/01/18 в 21:42
Oswell E. Spencer
Это какой-то фреймворк? как роутер выглядит?
цитата
12/01/18 в 21:46
mx-user
Oswell E. Spencer писал:
Это какой-то фреймворк? как роутер выглядит?
Это мой велосипед
<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);
define('APP_FOLDER', '/var/www/');
define('MAIN_DOMAIN', 'example.com');
function show_structure($structure) {
echo '<pre>';
if (isset($this)) {
echo "Класс: " . get_class($this) . '<br><br>';
}
echo print_r($structure);
echo '</pre>';
}
spl_autoload_register(function($class_name) {
$namespace = str_replace("\\", '/', $class_name);
include_once APP_FOLDER . $namespace . '.php';
});
set_exception_handler(function ($e) {
echo'<pre>';
echo "НЕПЕРЕХВАЧЕННОЕ ИСКЛЮЧЕНИЕ: " . "\r\n";
echo get_class($e) . "\r\n";
echo'</pre>';
echo $e->getMessage() . "\r\n";
echo'<pre>';
echo 'Файл: ' . str_replace(APP_FOLDER, '', $e->getFile()) . "<br>";
echo "Строка: " . $e->getLine() . "<br><br>";
echo print_r($e->getTraceAsString());
echo'</pre>';
});
try {
$this_site = (new Model\LocalSite())->getThisSite();
if (!is_a($this_site, '\Model\LocalSite')) {
throw new \Exception\BaseException(
"Запрашиваемый хост не найден в спике локальных сайтов"
);
}
$uri = filter_input(INPUT_SERVER, 'REQUEST_URI');
$routes = explode('/', strtolower($uri));
$allowed_routs = [
'check_cookie'
];
if (in_array($routes[1], $allowed_routs)) {
$action_name = 'action_' . $routes[1];
} else {
$action_name = 'action_index';
}
echo $action_name . '<br>';
$controller = new \Controller\Controller();
$controller->$action_name();
} catch (\Exception\BaseException $e) {
echo $e->makeLog($e);
exit();
}
цитата
12/01/18 в 22:09
Oswell E. Spencer
$routes[1] = 'check_cookie';
$allowed_routs = [
'check_cookie'
];
if (in_array($routes[1], $allowed_routs)) {
$action_name = 'action_' . $routes[1];
} else {
$action_name = 'action_index';
}
echo $action_name . PHP_EOL;
$controller = new \Controller\Controller();
$controller->$action_name();
срабатывает только один метод, смотри что у тебя там в $routes
цитата
12/01/18 в 22:12
mx-user
Oswell E. Spencer писал:
срабатывает только один метод, смотри что у тебя там в $routes
Таки да, хрень где-то здесь. Если запускать action_check_cookie напрямую, то работает нормально.
цитата
12/01/18 в 22:32
mx-user
echo '$routes[1]: '. "<br>";
echo var_dump($routes[1]) . "<br><br>";
echo '$allowed_routs: '. "<br>";
echo print_r(var_dump($allowed_routs)) . "<br><br>";
if (in_array($routes[1], $allowed_routs)) {
echo 'show check_cookie'. "<br>";
$action_name = 'action_' . $routes[1];
} else {
echo 'show index';
$action_name = 'action_index';
}
$controller = new \Controller\Controller();
$controller->$action_name();
Вывод:
$routes[1]:
string(12) "check_cookie"
$allowed_routs:
array(1) { [0]=> string(12) "check_cookie" } 1
show check_cookie
При этом, ессли заменить $action_name = 'action_index'; на $action_name = 'action_WTF'; то отрабатывает нормально.
я в ахуях... если отрабатывает if, то как на него может влиять else?
цитата
12/01/18 в 22:44
Oswell E. Spencer
Твой кусок у меня отрабатывает нормально, если у тебя не так, значит ты показываешь не всю картину, возможно action_index где то в другом месте вызывается.
цитата
12/01/18 в 22:50
S_Flash
Обычно подобные магии сводятся к попытке поставить\прочитать куки после вывода текста в документ\браузер. Или поставить и прочитать в том же скрипте.
цитата
12/01/18 в 23:06
mx-user
Oswell E. Spencer писал:
Твой кусок у меня отрабатывает нормально
Это нормально, глюк-то у меня.
Oswell E. Spencer писал:
если у тебя не так, значит ты показываешь не всю картину, возможно action_index где то в другом месте вызывается.
нене, картина практически вся.
Индекс-роутер целиком показал как есть, заменил только константы в начале. Контроллер тоже. В моделях только про базу данных, а больше и нет никаких файлов.
Роутер запускает пустой экшн action_check_cookie м попутно запускается магия. А скорее немного раньше, ибо меняя else все норм.
Ну да, но дело даже не в куках. Удалил вообще все упоминания о куках из скрипта, производится запись в базу, хотя не должна.
Может баг php-7.1.11? Хотя верится с трудом, но на ум приходит только это.
цитата
12/01/18 в 23:28
Oswell E. Spencer
даже не приходит ничего в голову
а так тоже будет index_action файрится?
if (in_array($routes[1], $allowed_routs)) {
echo 'show check_cookie'. "<br>";
$action_name = 'action_' . $routes[1];
}
if (!in_array($routes[1], $allowed_routs)) {
echo 'show index';
$action_name = 'action_index';
}
и еще в методе check_cookie допиши die() в конце, или там return true, хотя это все из серии бубнов уже. )
в метод index_action() положи var_dump(debug_backtrace()); и покажи, или debug_print_backtrace();
цитата
13/01/18 в 00:04
mx-user
Oswell E. Spencer писал:
а так тоже будет index_action файрится?
такая ж хрень
Oswell E. Spencer писал:
и еще в методе check_cookie допиши die() в конце, или там return true
не помогло
Oswell E. Spencer писал:
в метод index_action() положи var_dump(debug_backtrace()); и покажи, или debug_print_backtrace();
а не выводится!
НО! Закатал в базу вместо юида $uid = print_r(debug_backtrace(), true);
и получилось:
Array
(
[0] => Array
(
[file] => /home/app/main/Controller/Controller.php
[line] => 28
[function] => insert
[class] => Model\User
[object] => Model\User Object
(
[uid] =>
)
[type] => ->
[args] => Array
(
[0] => 5a592001b800d
)
)
[1] => Array
(
[file] => /home/app/main/Controller/Controller.php
[line] => 14
[function] => get_user
[class] => Controller\Controller
[object] => Controller\Controller Object
(
)
[type] => ->
[args] => Array
(
)
)
[2] => Array
(
[file] => /home/app/main/web/index.php
[line] => 75
[function] => action_index
[class] => Controller\Controller
[object] => Controller\Controller Object
(
)
[type] => ->
[args] => Array
(
)
)
)
а вот $uid = print_r(debug_print_backtrace(), true); не получилось!
Мы уже близко! Как понять, что вызывает action_index?
Как будто скрытая переадресация где-то.
цитата
13/01/18 в 00:13
Oswell E. Spencer
[file] => /home/app/main/web/index.php
[line] => 75
что на 75 строке? в твоем листинге 67 70 строк.
цитата
13/01/18 в 00:20
mx-user
Oswell E. Spencer писал:
что на 75 строке? в твоем листинге 67 70 строк.
Листинг постоянно меняется, я ж его туда-сюда дрочу. Но твой вопрос я понял, сейчас у меня это строка 64 и там $controller->$action_name(); ))
Еще из любопытного - поставил временные метки. Сначала исполняется запись в базу (то есть экшн_индекс) и ли шь потом экшн_чек_куки.
Отбой, что-то я не то насчитап. Все-таки сначала action_check_cookie
цитата
13/01/18 в 00:31
Oswell E. Spencer
То есть
[file] => /home/app/main/web/index.php
[line] => 75
[function] => action_index
[class] => Controller\Controller
[object] => Controller\Controller Object
говорит, что вызвали его в
$controller->$action_name();
но перед
$controller->$action_name();
$action_name содержит строку "action_cookie_check" ?
это пиздец какой-то
цитата
13/01/18 в 00:33
Oswell E. Spencer
action_check_cookie метод реально только одно echo там?
сделай методы public, а index action private
Controller.php там точно 1 и тот что нужен грузиться?
цитата
13/01/18 в 00:48
mx-user
Oswell E. Spencer писал:
это пиздец какой-то smail101.gif
Так вот я ж о том же!!!
Oswell E. Spencer писал:
action_check_cookie метод реально только одно echo там?
да
Oswell E. Spencer писал:
сделай методы public, а index action private
так работает правильно, как и должно
Oswell E. Spencer писал:
Controller.php там точно 1 и тот что нужен грузиться?
да
цитата
13/01/18 в 00:51
Oswell E. Spencer
Цитата:
так работает правильно, как и должно
ну это просто запретили из-вне метод вызывать, это не решение. но я честно не пойму, с какого хера index.php этот метод дергает)
блин у меня тот же v7.1.13 и работает как положено, как так?
Последний раз редактировалось: Oswell E. Spencer (
13/01/18 в 00:57
), всего редактировалось 1 раз
цитата
13/01/18 в 00:54
mx-user
а есть какой-нибудь трассировщик-профилировщик, который может разобрать выполнение скрипта на атомы?
xhprof может помочь?
цитата
13/01/18 в 01:04
Oswell E. Spencer
короче твой скрипт дважды запускается походу, каким то образом.
первый раз ты видишь echo 'ЭТО ВЫВОДИТСЯ, И ПОЧЕМУ-ТО ПРОИСХОДИТ ЗАПУСК action_index';
а второй раз в темную запускает index_action, и его echo ты не видишь, но он делает свою "грязную работу"
все запросы редиректятся на index.php ? запрос к favicon.ico походу и запускает твой скрипт второй раз, но уже с роутом который запускает index_action, так вижу
цитата
13/01/18 в 01:18
Oswell E. Spencer
Пиши в .htaccess
RewriteCond %{REQUEST_URI} !^/favicon.ico
если Apache, или аналог для nginx, это спасет тебя короче, удачи!
Последний раз редактировалось: Oswell E. Spencer (
13/01/18 в 01:19
), всего редактировалось 1 раз
цитата
13/01/18 в 01:18
mx-user
БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ
это favicon! Пиздец, два дня угрохал, чесал репу.
Спасибо, дружищще, ты спас мой рассудок от неминуемого помутнения! ))
Новая тема
Ответить
Эта страница в полной версии