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
даже не приходит ничего в голову icon_cry.gif


а так тоже будет 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" ? icon_mad.gif


это пиздец какой-то smail101.gif
цитата
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 и работает как положено, как так? smail101.gif

Последний раз редактировалось: 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 ты не видишь, но он делает свою "грязную работу" smail101.gif


все запросы редиректятся на index.php ? запрос к favicon.ico походу и запускает твой скрипт второй раз, но уже с роутом который запускает index_action, так вижу icon_cool.gif
цитата
13/01/18 в 01:18
 Oswell E. Spencer
Пиши в .htaccess
RewriteCond %{REQUEST_URI} !^/favicon.ico
если Apache, или аналог для nginx, это спасет тебя короче, удачи! icon_wink.gif

Последний раз редактировалось: Oswell E. Spencer (13/01/18 в 01:19), всего редактировалось 1 раз
цитата
13/01/18 в 01:18
 mx-user
БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ
это favicon! Пиздец, два дня угрохал, чесал репу.
Спасибо, дружищще, ты спас мой рассудок от неминуемого помутнения! ))


Эта страница в полной версии