Установка composer2 в Ubuntu 20.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
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. Например:
$memcached = new Memcache();
$memcached->addServer('localhost', 11211);
echo $memcached->get('key')."\n";
Исправить не смог, на текущий момент припер «костылем»:
$memcached = new Memcache();
$memcached->addServer('localhost', 11211);
$rr=$memcached->getVersion();
echo $memcached->get('key')."\n";
Да! Я сам в шоке, проблема решается вставкой ПЕРЕД get, не нужного getVersion
UPDATE: проблема была в банальной не хватке места на ЖД
Проблема: есть некий трудоёмкий процесс в скрипте PHP, который вынесен из родительского потока.При завершении его, при помощи posix_kill, остается зомби процесс. Код вида:
$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, но рабочих примеров найти не смог.
Решение: объявим, что нам собственно всё равно что происходит с «детьми»:
pcntl_signal(SIGCHLD, SIG_IGN);
После этого зомби-процессы плодиться перестают
Задача: 1) позволять прикреплять инструкцию к товару. 2) Отображать её в товаре, в том случае если файл прикреплен.
Решение:

2) Открываем шаблон детального отображения товара и добавляем:
В начале файла, заполняем переменную $INCTRUCTION_SRC
<?
$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'];
}
?>
В нужном месте для вывода добавляем:
<?php
if ($INSTRUCTION_SRC!=""){
?>
<a href="<?=$INSTRUCTION_SRC;?>">Инструкция</a>
<?php
};
?>
Результат:

Наконец дошли руки до освоения плагина databales.net для работы с таблицами. До этого всё использовал jqgrid. Вот типичный шаблон c выгрузкой в excel, загрузкой данных из json, добавления в POST своих данных, получения id выделенной строки.
HTML:
<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:
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:
$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;
Ну и получается что то вроде:
