Для получения полного доступа
зарегистрируйтесь.

corpsee    13   9 113


PHP-программист. Разработчик open source CI-сервера PHP Censor (Форк PHPCI. Cтатья о проекте), ранее активный контрибьютер в PHPCI. Так же контрибьютер в проекты: Infection, Phinx и другие.

  • Новосибирск
  • PHP, PostgreSQL, MySQL, Yii, Linux, Git, Mercurial, Ansible, Rabbitmq, ООП
  • Зарегистрирован 6 лет назад

dashboard.png

Простой сервер непрерывной интеграции с открытым исходным кодом для PHP проектов, форк PHPCI.

Удобен тем, что из коробки умеет работать с библиотеками для тестирования кода (PHPUnit, Atoum, Behat, Codeception, PHPSpec), а так же с утилитами для проверки PHP-кода (PHP Parallel Lint, Pdepend, PHP Code Sniffer, PHP Cpd, PHP Cs Fixer, PHPLoc, PHPMessDetect).

Умеет собирать проекты из различных источников (Github, Bitbucket, Gitlab, Git, Mercurial, SVN), хранить и отображать статистику сборок, а так же показывать динамику ошибок.

Так же имеет множество плагинов, не относящихся напрямую к проверке, включая, например, оповещения о сборке (Email, XMPP, Slack, IRC, Flowdock, HipChat).

В стандартной библиотеке есть функция str_getcsv для разбора CSV-строки в массив, но нет для нее пары, которая бы собирала массив в CSV-строку. Зато есть парные функции для сбора-разбора в файл - fputcsv / fgetcsv.

<?php
if (!function_exists('str_putcsv')) {
    /**
     * Format line as CSV string
     *
     * @param array  $fields      An array of values.
     * @param string $delimiter   [optional] The optional delimiter parameter sets the field delimiter (one character only).
     * @param string $enclosure   [optional] The optional enclosure parameter sets the field enclosure (one character only).
     * @param string $escape_char The optional escape_char parameter sets the escape character (one character only).
     * 
     * @return int the length of the written string or false on failure.
     */
    function str_putcsv(array $fields, $delimiter = ",", $enclosure = '"', $escape_char = "\\") {
        $fileHandler = fopen('php://temp', 'r+b');
        fputcsv($fileHandler, $handle, $fields, $delimiter, $enclosure, $escape_char);
        rewind($fileHandler);
        $csvString = rtrim(stream_get_contents($fileHandler), "\n");
        fclose($fileHandler);

        return $csvString;
    }
}
<?php
/**
 * @param string $method Метод (GET|POST|PUT|DELETE)
 * @param string $url    URL запроса
 * @param array  $data   Тело запроса (POST, PUT)
 * @param array  $gets   Дополнителные GET-параметры
 *
 * @return mixed
 */
function callRestApi($method, $url, $data = [], $gets = [])
{
    $curl = curl_init();
    switch (strtolower($method)) {
        case 'post':
            curl_setopt($curl, CURLOPT_POST, 1);
            if ($data) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            break;
        case 'put':
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
            curl_setopt($curl, CURLOPT_HTTPHEADER, ['X-HTTP-Method-Override: PUT']);
            if ($data) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
            }
            break;
        case 'delete':
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
            curl_setopt($curl, CURLOPT_HTTPHEADER, ['X-HTTP-Method-Override: DELETE']);
            break;
    }
    if ($gets) {
        $url = sprintf("%s?%s", $url, http_build_query($gets));
    }

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($curl);
    
    curl_close($curl);
    
    return $result;
}
<?php
/**
 * Функция ограничения кол-ва одновременно запущенных процессов скрипта с помощью файловых локов.
 * Полезна для скриптов, которые запускаются по крону с некоторой периодичностью.
 *
 * @param string  $process_name Название скрипта
 * @param integer $processes    Разрешенное кол-во одновременно запущенных процессов скрипта
 */
function lockProcess($process_name, $processes = 1) {
    $lock_file   = __DIR__ . $process_name . '_0.lock';
    $lock_exists = file_exists($lock_file);
    $i = 0;
    while ($i < $processes) {
        $lock_file   = __DIR__ . $process_name . '_' . $i . '.lock';
        $lock_exists = file_exists($lock_file);
        if (!$lock_exists) {
            break;
        }
        $i++;
    }
    // Если блокировку получить не удалось, значит второй экземпляр скрипта работает
    $lock_file_handler = fopen($lock_file, 'w');
    if (!flock($lock_file_handler, LOCK_EX | LOCK_NB)) {
        exit();
    }
    
    // Если файл блокировки уже существовал, но не был залочен, значит предыдущий запуск скрипта завершился некорректно
    if ($lock_exists) {
        error_log('Предыдущий запуск завершился с ошибкой!');
    }
    
    // По окончании работы необходимо снять блокировку и удалить файл
    register_shutdown_function(function() use ($lock_file_handler, $lock_file) {
        flock($lock_file_handler, LOCK_UN);
        unlink($lock_file);
    });
}