19 July, 2016

Чиним роутер Cockpit CMS под FastCGI

Привет! Не факт что это кому то еще понадобится кроме меня, но записать решение стоит. Итак, есть CockpitCMS в которой из коробки есть микрофреймворк Lime используюийся для роутинга и рендера вьюх. Так вот, если у вас PHP работает через FastCGI вся эта балалайка работать не будет.

Проблема в том что в роутере используется $_SERVER['PATH_INFO'] которая в данном случае будет пуста. Я починил вот так:

index.php

...

include_once('cockpit/bootstrap.php');

$_SERVER["PATH_INFO"] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); //чиним этой строкой

$app = new Lime\App();

$app->bind('/', function () use ($app) {
...

Заодно также добавил фикс в .htaccess убираюший лишние слеши:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
02 May, 2016

Ускоряем Soft RAID1 ext3

На одном из серверов возникла проблема после установки Proxmox 4 - катастрофически низкая скорость записи данных. Узнали вообще из монитора производительности 1С-Битрикс. Потом проблема подтвердилась утилитой pveperf.

pveperf /var/lib/vz/
CPU BOGOMIPS:      57602.48
REGEX/SECOND:      1789869
HD SIZE:           1809.50 GB (/dev/mapper/pve-data)
BUFFERED READS:    61.37 MB/sec
AVERAGE SEEK TIME: 22.60 ms
FSYNCS/SECOND:     17.53
DNS EXT:           25.42 ms
DNS INT:           53.82 ms (ru)

Параметр FSYNCS должен быть как минимум выше 200. Починилось добавлением опций монтирования в fstab (data=writeback,barrier=0):

/dev/pve/data   /var/lib/vz     ext3    defaults,data=writeback,barrier=0       1       2

Стало как-минимум вот так, как максимум доходило до 2500.

pveperf /var/lib/vz/
CPU BOGOMIPS:      57602.48
REGEX/SECOND:      1732888
HD SIZE:           1809.50 GB (/dev/mapper/pve-data)
BUFFERED READS:    75.74 MB/sec
AVERAGE SEEK TIME: 17.72 ms
FSYNCS/SECOND:     689.35
DNS EXT:           20.51 ms
DNS INT:           32.89 ms (ru)
13 July, 2015

Запускаем PhpStorm 9.0 в Docker

Запускаем PhpStorm 9.0 на Oracle JDK 8 в Docker.

Тут все быстро, создаем Dockerfile

FROM nimmis/java:oracle-8-jdk 

ADD http://download.jetbrains.com/webide/PhpStorm-9.0.tar.gz /opt/PhpStorm-9.0.tar.gz
RUN tar xvf /opt/PhpStorm-9.0.tar.gz -C /opt/
RUN rm -fv /opt/PhpStorm-9.0.tar.gz

RUN apt-get update && apt-get install -y php5-cli x11-utils


# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /opt/PhpStorm-141.1912/bin/phpstorm.sh

Запускаем билд

docker build -t phpstorm . 

Запускаем PHPstorm

docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix phpstorm
24 June, 2015

Авторизация в Битрикс без пароля

Когда работаешь с большим количеством сайтов на 1С-Битрикс нередко возникает ситуация с отсутствием пароля администратора, но полным доступом к файлам и БД. Править пароль в БД это не наш путь т.к. придется еще тревожить заказчика и вынуждать его сменить пароль.

Самый простой вариант это авторизоваться с помощью вот такого нехитрого скрипта:

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

global $USER;
if($USER->Authorize(1)) {
    unlink(__FILE__);
    LocalRedirect('/bitrix/');
} else {
    echo 'Ваша задумка не увенчалась успехом.';
}

Здесь мы авторизуемся под пользователем с id 1 (обычно это администратор сайта) и сразу попадаем в панель управления.

В случае успеха скрипт сам себя удаляет.

Сделано это с учетом того что большинство клиентских сайтов содержат в корне сайта кучу забытых разработчиками потенциально интересных для злоумышленников вещей - дампы БД, архивы с файлами CMS и прочий трэш.

03 April, 2015

Подменяем время на PHP

Возникают такие случаи когда во время разработки на PHP необходима возможность подмены времени. Можно конечно перевести часы в системе, но я бы так не рекомендовал делать ибо такое действие влечет за собой кучу проблем. А виртуальные сервера у некоторых хостеров могут и вовсе не грузиться после принудительной смены времени.

Так что самый безопасный способ это переопределение встроеных в PHP функций. Да, патчить и компилировать PHP мы не будем =)

Мы просто возьмем отсюда модуль PHP-TimeCop и установим его согласно приложенной инструкции.

После всех этих манипуляций нам остается только вызвать в начале скрипта вот такую функцию

$mytime = time()-86400;

timecop_freeze($mytime);

Таким образом мы зафиксировали в скрипте время ровно на сутки назад. Для удобства небольшой скрипт с этими двумя строчками можно подключать ко всем скриптам через директиву auto_prepend_file в .htaccess

28 August, 2014

Парсим URL средствами JS

Итак, самый простой способ, который гуляет по интернету это создание в DOM элемента a у которого js автоматически распознает части URl

Пример:

//Создаем элемент a
var parse = document.createElement('a');
//Присваиваем ему на URL
parse.href = "http://test.ru:81/super/long/path/?search=test#about";

var result = document.getElementById('result');

result.innerHTML = result.innerHTML + '<strong>test1</strong><br/><hr/><br/>';
result.innerHTML = result.innerHTML + parse.protocol + '<br/>'; // => "http:""
result.innerHTML = result.innerHTML + parse.hostname + '<br/>'; // => "test.ru"
result.innerHTML = result.innerHTML + parse.port + '<br/>';     // => "81"
result.innerHTML = result.innerHTML + parse.pathname + '<br/>'; // => "/super/long/path/"
result.innerHTML = result.innerHTML + parse.search + '<br/>';   // => "?search=test"
result.innerHTML = result.innerHTML + parse.hash + '<br/>';     // => "#about"
result.innerHTML = result.innerHTML + parse.host + '<br/>';     // => "test.ru:81"

parse.href = "http://test.ru/super/long/path/?search=test#about";

result.innerHTML = result.innerHTML + '<br/><br/><strong>test2</strong><br/><hr/><br/>';
result.innerHTML = result.innerHTML + parse.port;     // => ""
result.innerHTML = result.innerHTML + parse.host + '<br/>';     // => "test.ru"

Ссылка на живой пример

Новые записи →Home← Старые записи