Установка composer2 в Ubuntu 20.4
1 2 3 4 |
wget https://getcomposer.org/installer --no-check-certificate -O "composer-setup.php" php composer-setup.php chmod -c 777 * sudo mv composer.phar /usr/bin/composer |
Жизнь замечательных грибов
Здесь собраны статьи, наработки, исправление ошибок и решение проблем связанных с разработкой на языке PHP
1 2 3 4 |
wget https://getcomposer.org/installer --no-check-certificate -O "composer-setup.php" php composer-setup.php chmod -c 777 * sudo mv composer.phar /usr/bin/composer |
И снова поймал ту-же ошибку — воспроизводится при получении ранее не сохраненного в текущей сессии php значения get. Например:
1 2 3 |
$memcached = new Memcache(); $memcached->addServer('localhost', 11211); echo $memcached->get('key')."\n"; |
Исправить не смог, на текущий момент припер «костылем»:
1 2 3 4 |
$memcached = new Memcache(); $memcached->addServer('localhost', 11211); $rr=$memcached->getVersion(); echo $memcached->get('key')."\n"; |
Да! Я сам в шоке, проблема решается вставкой ПЕРЕД get, не нужного getVersion
UPDATE: проблема была в банальной не хватке места на ЖД
Проблема: есть некий трудоёмкий процесс в скрипте PHP, который вынесен из родительского потока.При завершении его, при помощи posix_kill, остается зомби процесс. Код вида:
1 2 3 4 5 6 7 8 9 10 11 |
$child_pid = pcntl_fork(); if (($child_pid==0) or ($child_pid==-1)){ // -1 если дочерний процесс стартовать не удалось //здесь много грузящей процессор работы PutLog(messageslogfile, BOn."--завершил дочерний процесс", true); if ($child_pid!=-1){ posix_kill(posix_getpid(), SIGKILL);}; // если продолжаем в основном потоке, то и кончаем его } else { PutLog(messageslogfile, BOn."--стартовал дочерний процесс", true); }; |
Проблема возникает из за того, что нам нужно как-то отчитаться в главный процесс, что дочерний процесс завершен, и только тогда ОС поймёт, что зомби можно убирать. Классически для этого используют pcntl_wait, но рабочих примеров найти не смог.
Решение: объявим, что нам собственно всё равно что происходит с «детьми»:
1 |
pcntl_signal(SIGCHLD, SIG_IGN); |
После этого зомби-процессы плодиться перестают
Задача: 1) позволять прикреплять инструкцию к товару. 2) Отображать её в товаре, в том случае если файл прикреплен.
Решение:
2) Открываем шаблон детального отображения товара и добавляем:
В начале файла, заполняем переменную $INCTRUCTION_SRC
1 2 3 4 5 6 7 8 9 10 |
<? $res = CIBlockElement::GetProperty($arResult['IBLOCK_ID'], $arResult['ID'], "sort", "asc", array("CODE" => "files")); if ($ob = $res->GetNext()) { $INSTRUCTION_VALUE = $ob['VALUE']; $file = CFile::GetFileArray($INSTRUCTION_VALUE); $INSTRUCTION_SRC = $file['SRC']; } ?> |
В нужном месте для вывода добавляем:
1 2 3 4 5 6 7 |
<?php if ($INSTRUCTION_SRC!=""){ ?> <a href="<?=$INSTRUCTION_SRC;?>">Инструкция</a> <?php }; ?> |
Результат:
Наконец дошли руки до освоения плагина databales.net для работы с таблицами. До этого всё использовал jqgrid. Вот типичный шаблон c выгрузкой в excel, загрузкой данных из json, добавления в POST своих данных, получения id выделенной строки.
HTML:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<table id="clientsgrid" class="display" style="width:100%"> <thead> <tr> <th>#</th> <th></th> <th>Телефон</th> <th>ФИО</th> <th>Email</th> <th>Дата</th> </tr> </thead> </table> |
Javascript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
function ClientsGridList(){ table=$('#clientsgrid').DataTable( { dom: 'Bfrtip', destroy: true, select: true, buttons: [ 'excel','print' ], paging: true, keys: true, //scrollY: 200, //scrollCollapse: true, //scroller: true, "processing": true, "serverSide": true, "ajax": { "url": "/server/clients/ClientsGrid", "type": "POST", "data": { "owner":owner_select.value, "segment":users_groups_array_select.value } }, "language": { url: '/js/i18n/datatable.json' }, "columns": [ { "data": "id"}, { "data": "deleted" }, { "data": "phone"}, { "data": "name" }, { "data": "email" }, { "data": "dt"} ] } ); $('#clientsgrid').unbind(); $('#clientsgrid').on('dblclick', 'tbody td', function () { tr = $(this).closest('tr'); //console.log(tr); row = table.row( tr ); data=row.data(); user_id=data.id; DrawCartUser(user_id); }); // table.ajax.reload(); }; |
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$owner= _POST("owner"); // владелец (если суперадмин - выводим всех) $segment= _POST("segment"); // какой сегмент (если -1, выводим всех) $draw= _POST("draw"); // какая страница $start= _POST("start"); // с какой записи по счету $length= _POST("length"); // записей на страницу $order= _POST("order")[0]["column"]; // по какой колонке сортируем $order= _POST("columns")[$order]["data"]; $sidx= _POST("order")[0]["dir"]; // способ сортировки $search_value=_POST("search")["value"]; // что ищем $search_regex=_POST("search")["regex"]; // регулярка $res=$Users->GetClientsGrid($Users,$owner,$segment,$start,$length,$order,$sidx,$search_value); if ($res->error): echo '{"error": "'.$res->errortext.'" }'; die(); else: $res->result->draw=$draw; jsonExit($res->result); endif; |
Ну и получается что то вроде: