С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 12/01/18 в 21:33 |
Код: [развернуть] |
<?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 раз
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 12/01/18 в 21:42 |
Это какой-то фреймворк? как роутер выглядит?
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 12/01/18 в 21:46 |
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();
}
|
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 12/01/18 в 22:09 |
Код: [развернуть] |
$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
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 12/01/18 в 22:12 |
Oswell E. Spencer писал: | срабатывает только один метод, смотри что у тебя там в $routes |
Таки да, хрень где-то здесь. Если запускать action_check_cookie напрямую, то работает нормально.
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 12/01/18 в 22:32 |
Код: [развернуть] |
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?
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 12/01/18 в 22:44 |
Твой кусок у меня отрабатывает нормально, если у тебя не так, значит ты показываешь не всю картину, возможно action_index где то в другом месте вызывается.
|
|
|
|
📈sflash.biz
С нами с 03.11.12
Сообщения: 3913
Рейтинг: 4447
|
Добавлено: 12/01/18 в 22:50 |
Обычно подобные магии сводятся к попытке поставить\прочитать куки после вывода текста в документ\браузер. Или поставить и прочитать в том же скрипте.
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 12/01/18 в 23:06 |
Oswell E. Spencer писал: | Твой кусок у меня отрабатывает нормально |
Это нормально, глюк-то у меня.
Oswell E. Spencer писал: | если у тебя не так, значит ты показываешь не всю картину, возможно action_index где то в другом месте вызывается. |
нене, картина практически вся.
Индекс-роутер целиком показал как есть, заменил только константы в начале. Контроллер тоже. В моделях только про базу данных, а больше и нет никаких файлов.
Роутер запускает пустой экшн action_check_cookie м попутно запускается магия. А скорее немного раньше, ибо меняя else все норм.
Ну да, но дело даже не в куках. Удалил вообще все упоминания о куках из скрипта, производится запись в базу, хотя не должна.
Может баг php-7.1.11? Хотя верится с трудом, но на ум приходит только это.
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 12/01/18 в 23:28 |
даже не приходит ничего в голову
а так тоже будет 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();
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 13/01/18 в 00:04 |
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?
Как будто скрытая переадресация где-то.
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 13/01/18 в 00:13 |
[file] => /home/app/main/web/index.php
[line] => 75
что на 75 строке? в твоем листинге 67 70 строк.
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 13/01/18 в 00:20 |
Oswell E. Spencer писал: | что на 75 строке? в твоем листинге 67 70 строк. |
Листинг постоянно меняется, я ж его туда-сюда дрочу. Но твой вопрос я понял, сейчас у меня это строка 64 и там $controller->$action_name(); ))
Еще из любопытного - поставил временные метки. Сначала исполняется запись в базу (то есть экшн_индекс) и ли шь потом экшн_чек_куки.
Отбой, что-то я не то насчитап. Все-таки сначала action_check_cookie
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 13/01/18 в 00:31 |
То есть
[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" ?
это пиздец какой-то
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 13/01/18 в 00:33 |
action_check_cookie метод реально только одно echo там?
сделай методы public, а index action private
Controller.php там точно 1 и тот что нужен грузиться?
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 13/01/18 в 00:48 |
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 и тот что нужен грузиться? |
да
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 13/01/18 в 00:51 |
Цитата: |
так работает правильно, как и должно
|
ну это просто запретили из-вне метод вызывать, это не решение. но я честно не пойму, с какого хера index.php этот метод дергает)
блин у меня тот же v7.1.13 и работает как положено, как так?
Последний раз редактировалось: Oswell E. Spencer (13/01/18 в 00:57), всего редактировалось 1 раз
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 13/01/18 в 00:54 |
а есть какой-нибудь трассировщик-профилировщик, который может разобрать выполнение скрипта на атомы?
xhprof может помочь?
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 13/01/18 в 01:04 |
короче твой скрипт дважды запускается походу, каким то образом.
первый раз ты видишь echo 'ЭТО ВЫВОДИТСЯ, И ПОЧЕМУ-ТО ПРОИСХОДИТ ЗАПУСК action_index';
а второй раз в темную запускает index_action, и его echo ты не видишь, но он делает свою "грязную работу"
все запросы редиректятся на index.php ? запрос к favicon.ico походу и запускает твой скрипт второй раз, но уже с роутом который запускает index_action, так вижу
|
|
|
|
+
С нами с 09.05.17
Сообщения: 661
Рейтинг: 586
|
Добавлено: 13/01/18 в 01:18 |
Пиши в .htaccess
RewriteCond %{REQUEST_URI} !^/favicon.ico
если Apache, или аналог для nginx, это спасет тебя короче, удачи!
Последний раз редактировалось: Oswell E. Spencer (13/01/18 в 01:19), всего редактировалось 1 раз
|
|
|
|
С нами с 19.05.17
Сообщения: 191
Рейтинг: 326
|
Добавлено: 13/01/18 в 01:18 |
БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ
это favicon! Пиздец, два дня угрохал, чесал репу.
Спасибо, дружищще, ты спас мой рассудок от неминуемого помутнения! ))
|
|
|
|