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

Раздел:
Подраздел:
Языки:


dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Сразу покажу демо:

l41m5gGukcDpZa2MU.gif

В качестве фреймворка используем Yii2, для работы с веб-сокетами Ratchet.

Добавляем через composer Ratchet:

composer require cboden/ratchet

Затем, создаём контроллер в папке commands для запуска сервера:

Продолжение »

Maxim Kuptsov
  • Репутация: 23
  • Сниппеты: 1
  • Ревизии: 1

Простой шаблонизатор, когда такие монстры как Twig избыточные

class Templater {
	/** @var array Данные для шаблона */
	public $data = [];
	/** @var string Путь к шаблону */
	public $templatePath = "";

	public function render(){
		ob_start();
		ob_implicit_flush(false);
		if ($this->data) extract($this->data);
		require($this->templatePath);
		return ob_get_clean();
	}
}
Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Очень быстрый пример от наших зарубежных коллег http://stackoverflow.com/questions/2524151/php-get-all-subdirectories-of-a-given-directory, как можно обойти все вложенные директории и получить их список.

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/home/nepster/www/test.ru'),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach ($iterator as $file) {
    if ($file->isDir()) {
        echo $file->getRealpath(), PHP_EOL;
    }
}
Gravatar image
tooleks
  • Репутация: 20
  • Сниппеты: 1
  • Ревизии: 0

Простая функция для определения AJAX запроса на PHP.

<?php

function request_is_ajax()
{
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
        strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Такой подход к записи используется в моей библиотеке Sitemap для генерации огромных карт сайтов, содержащих сотни тысяч URL.

// пишем данные в буфер чтобы не дёргать диск слишком часто
$bufferSize = 1000;

$filePath = 'test.xml';

$writer = new XMLWriter();
// для буфера используем память
$writer->openMemory();


$writer->startDocument('1.0', 'UTF-8');
$writer->setIndent(true);
$writer->startElement('test');

while ($i < 10000) {                  
	if ($i % $bufferSize) {
		// если буфер полон, скидываем его в файл
		file_put_contents($filePath, $writer->flush(true), FILE_APPEND);
	}
	$writer->writeElement('item', $i);
}

$this->writer->endElement();

$this->writer->endDocument();

// пишет остаток буфера в файл
file_put_contents($filePath, $writer->flush(true), FILE_APPEND);
Gravatar image
jumper423
  • Репутация: 58
  • Сниппеты: 9
  • Ревизии: 2

Yii2 VK

Компонент для расширенной работы с ВК API в YII2. Загрузка изображений, распознавание капчи, постановка очередей и многое другое.

Сайт с подробным описанием yii2 api vk GitHub

Особенности

  • Задержка выполнения
  • Разделины post и get
  • Загрузка изображений
  • Добавление в очереди
  • Запись задач и выполнению их по cron-у
  • Интеграция с распознованием капчи
  • Запись в атрибуты token-а

Продолжение »

samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Пройтись по массиву циклом, но последний элемент обработать особенным образом. Задачка типичная, решений много. Одно из лучших в то же время является одним из простейших.

$last = array_pop($array);
foreach ($array as $value) {
   // делаем что-либо с каждым элементом
}
// делаем что-либо с последним элементом $last
Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Удалить повторяющиеся значения из многомерного массива

// 1 вложенность 
$array = array_map("unserialize", array_unique(array_map("serialize", $array)));

// Рекурсивно
function super_unique($array) {
    $result = array_map("unserialize", array_unique(array_map("serialize", $array)));
    foreach ($result as $key => $value) {
        if ( is_array($value) ) {
        	$result[$key] = super_unique($value);
        }
    }
    return $result;
}
samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Несмотря на то, что затея сама по себе довольно бессмысленна, можно использовать анонимные функции для обработки URL и полностью выкинуть MVC примерно так же, как это рекламируют популярные микрофреймворки.

require 'vendor/autoload.php';
require 'vendor/yiisoft/yii2/Yii.php';


$app = new CallbackWebApplication([
    'id' => 'MyApplication',
    'basePath' => __DIR__,
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
        ],
    ],
]);

$app->onGet('hello/<name>', function($name) {
    return 'Hello, ' . $name . '!';
});
$app->run();
<?php
class CallbackWebApplication extends \yii\web\Application
{
    private $callbacks = [];

    /**
     * @inheritdoc
     */
    public function handleRequest($request)
    {
        list ($route, $params) = $request->resolve();
        if (preg_match('~callbacks/(\d+)~', $route, $matches) && isset($this->callbacks[$matches[1]])) {
            $result = call_user_func_array($this->callbacks[$matches[1]], $params);
        } else {
            throw new \yii\web\NotFoundHttpException();
        }

        $response = $this->getResponse();
        $response->data = $result;
        return $response;
    }

    public function onGet($pattern, callable $callback)
    {
        // можно реализовать через свой UrlRule,
        // но было очень лениво
        $callbackIndex = count($this->callbacks);
        $this->callbacks[$callbackIndex] = $callback;
        Yii::$app->getUrlManager()->addRules([
            $pattern => 'callbacks/' . $callbackIndex
        ]);
    }
}
Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Видел вот такой подход: http://gostash.it/ru/stashes/232 И нашел альтернативу чуть по проще.

 list($a, $b) = [$b, $a];