Ответы пользователя по тегу PHP
  • Как запустить Gulp из Php?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    По хорошему вам сначала нужно узнать все env переменные которые у вас в юзере есть из которого вы запускаете из консоли сборщик. для этого введите env

    Потом подсуньте вывод PATH в putenv и пути до ноды и npm в соотвествующие переменные.

    Вот пример рабочего сборщика на нашем проекте (запускается из браузера при совпадении в GET секретного ключа который сами укажите):

    <?php
    ini_set('output_buffering', '0');
    
    $documentRoot = dirname(dirname(__DIR__));
    
    putenv('LANG=C');
    putenv('LC_ALL=C');
    putenv('PATH=/home/gituser/.nvm/versions/node/v16.13.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin');
    putenv("SHELL=/bin/bash");
    putenv("HOME=/home/gituser");
    putenv("COMPOSER_HOME=$documentRoot/.composer");
    
    $key = 'MY_SECRET_KEY';
    $php = '/usr/bin/php';
    $composer = "$php /usr/local/bin/composer";
    $node = "~/.nvm/versions/node/v16.13.0/bin/node";
    $npm = "~/.nvm/versions/node/v16.13.0/bin/npm";
    
    if (isset($_GET['key']) && @$_GET['key'] == $key)
    {
        echo '<pre> Update...'.PHP_EOL;
    
        $cmd_arr = [
    		"cd $documentRoot && $node $npm i",
    		"cd $documentRoot && gulp build --env=prod",
        ];
    
        foreach ($cmd_arr as $cmd){
            echo PHP_EOL.PHP_EOL."<b>$cmd</b>".PHP_EOL;
            system("{ $cmd; } 2>&1");
            flush();
        }
    
        echo '<hr> Done.'.PHP_EOL;
        exit;
    }
    
    header('HTTP/1.1 404 Not Found');
    echo '404 Not Found.';
    Ответ написан
    Комментировать
  • Как реализовать отправку данных в БД с форм выведенных циклом?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Если я правильно понял вам нужно заполнять input так чтобы его потом можно было прочитать в php для вставки в справочник норм. Если да, то вот:

    <?php
    foreach ($resselecttech as $restech) { ?>
    	<td><input required type="text" name="values[<?php echo $ressub->name_subdivision; ?>][<?php echo $restech->type;?>]"><span>единиц техники</span></td>
    <?php
    } ?>


    замените этим куском кусок который отвечает за вывод инпута. при сохранении формы вы получите многомерный массив в $_POST['values'] такой структуры:

    [
    	'ОУР' => [
    		'ИБП' => 5, // где 5 это значение из инпута
    		'КМТ А3' => ...,
    		...
    	],
    	'ОЭБ и ПК' => [
    		'ИБП' => ...,
    		'КМТ А3' => ...,
    		...
    	],
    	...	
    ]


    P.S. естественно имена лучше заменить на id подразделений для более удобной работы
    Ответ написан
    1 комментарий
  • Получения энтропии для генератора случайных чисел в PHP - как можно сделать случайность по настоящему случайной?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Наверно все зависит от вашего продукта. Если нужно что-то внешнее, получите это через shell_exec например.
    Ответ написан
    Комментировать
  • Как заставить работать phpdismod?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Я не знал что есть такая утилита. Я обычно через php.ini комменчу че не нужно и раскоменчю что нужно.
    Ответ написан
    Комментировать
  • Как отсортировать или пересобрать многомерный массив по значению?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    <?php
    
    $arr = [
    	['id' => 1, 'rating' => 2],
    	['id' => 2, 'rating' => 4],
    	['id' => 3, 'rating' => 1],
    ];
    
    function sortByRating($a, $b) {
        return $b['rating'] - $a['rating'];
    }
    
    usort($arr, 'sortByRating');
    
    print_r($arr);
    Ответ написан
    3 комментария
  • Почему выводит только 1 элемент?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    в цикле сделайте $msg .= вместо просто =

    иначе вы ее перезаписываете просто.
    Ответ написан
  • Как правильно получить JSON через PHP?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Что-то у вас с настройками php. у меня все ок по этому урлу:

    <?php
    
    $url = 'http://195.78.42.246:3434/upp_shum/hs/vsAerostar/GetClients';
    $response = file_get_contents($url);
    $json = json_decode($response);
    print_r($json);


    выдает

    response
    stdClass Object
    (
    [Clients] => Array
    (
    [0] => stdClass Object
    (
    [phone] => 380551256165
    [email] => sample@gmail.copm
    [password] => password
    [number] => 35023058
    )

    [1] => stdClass Object
    (
    [phone] => 380999888888
    [email] => sample2222@gmail.copm
    [password] => password123
    [number] => 35023058
    )

    [2] => stdClass Object
    (
    [phone] => 380555444444
    [email] => login@g
    [password] => pass
    [number] => 41494252
    )

    [3] => stdClass Object
    (
    [phone] => 382222222221
    [email] => meil@.mail.com
    [password] => 112233
    [number] => 30594998
    )

    )

    )
    Ответ написан
  • Как правильно вывести значение?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    foreach ($instPosts as $elem) {
    
        echo '<div><img src="' . $elem . '"></div>';
    
    }
    Ответ написан
    Комментировать
  • Как выполнять задачу каждые 10 секунд в PHP?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    <?php
    
    function job() {
    	echo 'JOB...' . PHP_EOL;
    }
    
    while(true) {
    	job();
    	sleep(10);
    }


    и для удобства контроля поставьте supervisor, чтобы сделить за падениями демона или перезапуском.
    Ответ написан
    2 комментария
  • Как сделать в одном контроллере разные права на action?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    rules это массив с правилами. добавляйте их сколько хотите. например:

    //...
    'rules' => [
    	[
    		'allow' => true,
    		'actions' => ['action1',],
    		'roles' => ['root', ],
    	],
    	[
    		'allow' => true,
    		'actions' => ['action2', 'actionN', ],
    		'roles' => ['admin', '?', '@'],
    	],
    	//...
    ],
    //...
    Ответ написан
    Комментировать
  • Кто поможет разобраться с WEBSOCKET?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Посмотрите в сторону https://socket.io/ возможно он поможет с быстрым стартом. там php не нужен.
    Ответ написан
    Комментировать
  • Как подключиться к WebSocket'у, который находится на удаленном сервере?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Если вы подключаетесь находясь на домене с ssl, то и на сервере с websockets должен быть сертификат (обычный let's encrypt хватит) и обращаться нужно через wss://domain/...

    Если вы обращаетесь с домена без ssl или простого IP - то ws://IP/.. будет достаточно.

    UPD.
    В комментах не всем понятно что я имел ввиду, поэтому для большей точности распишу подробнее:

    1. если вы с локалки подключаетесь к сокет-серверу который лежит "где-то", то к нему можно обращатся по ip или домену. через ws или wss (на сокет-серве должны быть правильно настроены CORS-заголовки, чтобы вам было разрешено подключаться).

    2. если вы обращаетесь с домена на сокет-сервер который лежит на другом домене:
    2.1 если у вас нет ssl - вы можете обращаться к ws или wss.
    2.2 если у вас есть ssl - вы можете обращаться только к wss.

    для всех пунктов выше действует правило: если вы обращаетесь к wss то в любом случае это будет обращение по домену а не по ip, т.к. сертификаты не выдаются на ip.
    Ответ написан
    6 комментариев
  • Как сменить изображение после перезагрузки страницы?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Если вам нужна прямая последовательность (1, 2, 3...) то нужно хранить id текущей картинки в куках, и при следующем обновлении (выполнении php) читать эту куку и делать инкрементацию и снова перезаписывать куку с новым значением, после чего выводить новую картинку. и так до бесконечности. Так же нужна будет проверка на то что изображение есть. если у вас их 3, а текущий инкремент показывает 4 - то сбрасывать снова на 1.

    В таком случае картинки будут последовательно показываться для каждого пользователя индивидуально. т.е. нет гарантии что 10 пользователей будут видеть одну и ту же картинку.

    Если вам нужно показывать всем пользователям одну и ту же последовательность, то данные о текущей картинки нужно хранить на стороне сервера (в файле, или бд). тогда все пользователи будут видеть одинаковую последовательность. но вам ее нужно будет привязать к какому то событию общему. например к последней цифре секунды текущего времени. у вас есть 10 картинок и есть 10 цифр секунды (0-9) тогда вывод можно сделать так:

    <?php
    
    // Последняя цифра секунды
    $digit = (int) date('s') % 10;
    
    // Изображение по умолчанию если текущего нет
    $image = '1.png';
    
    // Проверяем существует ли изображение
    if(file_exists("{$digit}.png")) {
    	$image = "{$digit}.png";
    }
    
    ?>
    
    <img src="<?= $image; ?>"/>


    в таком случае при обновлении страницы будет каждый раз разное изображение (0.png ... 9.png)
    Ответ написан
    Комментировать
  • Как получить данные из этого массива?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    echo $data->data->name;

    а так?
    Ответ написан
    Комментировать
  • Почему запуск PHP скрипта под Apache на много медленее, чем под CLI?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Очевидно что надо смотреть конфиги апача, сколько ему разрешено использовать оперы на процесс, и в каком режиме там работает пхп (обычный через модуль апача или как fpm).
    Ответ написан
    Комментировать
  • Где применяются key(), next(), current()?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    $user_ar = array(
    		'name'=>'Alex', 
    		0=>10, 
    		'me'=>20
    );
    
    while(key($user_ar)){
    	echo key($user_ar);
    	echo '=>';
    	echo current($user_ar);
    	echo '<hr>';
    	next($user_ar);
    };


    3. вы сами себе в ногу стреляете этим примером :) в проверке while(тут) у вас когда итерация добирается до 2го элемента с индексом 0,
    этот 0 и прерывает цикл (т.к. 0 = false). Дело тут не в том, что индекс числительный, а именно в том что он равен нулю. Попробуйте поставить 1, и проблем быть не должно

    ну а чтобы пройтись по массиву еще раз, нужно сбросить ему указатель через reset(). Либо используйте обычные foreach.
    Ответ написан
    6 комментариев
  • Как добавить массив в базу?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    <?php
    
    $arr = ['a' => 'b'];
    $arrStr = json_encode($arr);
    $q = "INSERT INTO tbl (column) VALUES ('$arrStr');";
    // execute $q ...
    
    
    // вытаскиваем
    $q = "SELECT ...";
    
    $arr = json_decode($dbResult['column']);
    Ответ написан
    5 комментариев
  • Как заглушить вывод echo внутри одной функции?

    t-alexashka
    @t-alexashka Автор вопроса
    Сразу пишу legacy код
    <?php
    
    function fn() {
     echo 'ok';
    }
    
    ob_start();
    fn();
    ob_end_clean();
    echo 123;
    Ответ написан
    Комментировать
  • Почему при обращении к объекту он ничего не возвращает?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    <?php
    
    /**
     * core class
     */
    class Core
    {
      public $token;
      public function __construct()
      {
        $this->token = file_get_contents('data.config');
      }
      public function getToken () {
        return $this->token;
      }
    }
    
    $core = new Core();
    echo $core->getToken();


    непонятно только зачем вам getToken метод если у вас переменная публичная. Можно просто $core->token вызвать. или прячьте ее за protected|private, чтобы хоть логика какая-то была в этом методе. сейчас он бесполезен.
    Ответ написан
    Комментировать
  • Почему правильно сравниваются СТРОКИ даты?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    насколько я знаю строки сравниваются посимвольно (char коды). и тут чар-код "1" будет меньше чем "2".

    до первого вхождения. как только удается определить какая строка меньше - дальше проверка не производится. в вашем случае она останавливается на последнем символе дня.
    Ответ написан