Архив метки: php

Вставка QR кода в текст RTF

Ну примерно так.. Пришлось еще конвертировать из png в jpg, т.к. png рандомно не распознается Microsoft Word как картинка.

CreateQr($blibase,$number,abs($rec),$number.'qr_pay.png');
	
	png2jpg	("/tmp/$number"."qr_pay.png","/tmp/$number"."qr_pay.jpg",100);
	
	$b=fopen("/tmp/$number"."qr_pay.jpg","rb");    
	$imgData=getimagesize("/tmp/$number"."qr_pay.jpg");
	$newImage="";
	$newImagePre="{\\*\\shppict{\\pict \\jpegblip \\picw".$imgData[0]." \\pich".$imgData[1]." \\wbmbitspixel24 ";
	while (!feof($b)) {
	    $newImage.= fgets($b);
	}
	$hex=bin2hex($newImage);
        $imgDat=$newImagePre.$hex."}}"; 
	//    $temp .$imgDat;
	$temp = str_replace("!qrkode!", $imgDat, $temp);

function png2jpg($originalFile, $outputFile, $quality) {
    $image = imagecreatefrompng($originalFile);
    imagejpeg($image, $outputFile, $quality);
    imagedestroy($image);
}

Пример клиента WebSocket на PHP

Если клиент на javascript для WebSocket это весьма простая вещь, то на PHP чуточку сложнее. Готовых примеров в сети раз-два и обчелся. Вот пример одной из реализаций:

 

$local = "http://грибовы.рф";		    
$data = "Скрипт обработки выбора фильтра абонентом";  
$key="woeudhцукацук цук пупркеркеуенakcslerug;er";

	$host=$row2["mysql_ip"];
	$port = 8000;
	$head = "GET / HTTP/1.1"."\r\n".
		"Upgrade: WebSocket"."\r\n".
		"Connection: Upgrade"."\r\n".
		"Origin: $local"."\r\n".
		"Host: $host"."\r\n".
		"Sec-WebSocket-Key: asd245345235d6asd6as7d"."\r\n".
		"Content-Length: ".strlen($data)."\r\n"."\r\n";
	
	$sock = fsockopen($host, $port, $errno, $errstr, 2);
	fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);
	$headers = fread($sock, 2000);
	//echo $headers;
	fwrite($sock, hybi10Encode($data)) or die('error:'.$errno.':'.$errstr);
	$wsdata = fread($sock, 2000);
	//var_dump(hybi10Decode($wsdata));
	//echo "--send\n";    
	    $mess["key"]=$key;
	    $mess["command"]="UpdateFilterContent";
	    fwrite($sock, hybi10Encode(json_encode($mess))) or die('error:'.$errno.':'.$errstr);
	//echo "--read\n";        
	$wsdata = fread($sock, 2000);
	//var_dump(hybi10Decode($wsdata));
	fclose($sock);		

Вспомогательные функции:

Читать далее Пример клиента WebSocket на PHP

Простой сервер websockets на php

Фактически это каркас, для создания «чего-то поинтереснее» . Чисто логика, ничего лишнего.

javascript клиент:

<!DOCTYPE html>
<!--
(с) 2011-2015 Грибов Павел
http://грибовы.рф
Если исходный код найден в сети - значит лицензия GPL v.3
-->
<html>
    <head>
	<title>TODO supply a title</title>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
	<div>TODO write content</div>
	<script>
	    var socket = new WebSocket("ws://localhost:8000");
	    socket.onopen = function() {
	      console.log("Соединение установлено.");
	    };

	    socket.onclose = function(event) {
	      if (event.wasClean) {
		console.log('Соединение закрыто чисто');
	      } else {
		console.log('Обрыв соединения'); // например, "убит" процесс сервера
	      }
	      alert('Код: ' + event.code + ' причина: ' + event.reason);
	    };

	    socket.onmessage = function(event) {
	      console.log("Получены данные " + event.data);
	    };

	    socket.onerror = function(error) {
	      console.log("Ошибка " + error.message);
	    };	    
	    var timerId = setInterval(function() {
	      socket.send("тик!");
	    }, 2000);	    
	</script>
    </body>
</html>

php server:

#!/usr/bin/php
<?php

$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);

if (!$socket) {
    die("$errstr ($errno)\n");
}

$connects = array();
while (true) {
    //формируем массив прослушиваемых сокетов:
    $read = $connects;
    $read []= $socket;
    $write = $except = null;

    if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута)
        break;
    }

    if (in_array($socket, $read)) {//есть новое соединение
        //принимаем новое соединение и производим рукопожатие:
        if (($connect = stream_socket_accept($socket, -1)) && $info = handshake($connect)) {
            $connects[] = $connect;//добавляем его в список необходимых для обработки
            onOpen($connect, $info);//вызываем пользовательский сценарий
        }
        unset($read[ array_search($socket, $read) ]);
    }

    foreach($read as $connect) {//обрабатываем все соединения
        $data = fread($connect, 100000);

        if (!$data) { //соединение было закрыто
            fclose($connect);
            unset($connects[ array_search($connect, $connects) ]);
            onClose($connect);//вызываем пользовательский сценарий
            continue;
        }

        onMessage($connect, $data,$info);//вызываем пользовательский сценарий
    }
}

fclose($server);

function handshake($connect) {
    $info = array();

    $line = fgets($connect);
    $header = explode(' ', $line);
    $info['method'] = $header[0];
    $info['uri'] = $header[1];

    //считываем заголовки из соединения
    while ($line = rtrim(fgets($connect))) {
        if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {
            $info[$matches[1]] = $matches[2];
        } else {
            break;
        }
    }

    $address = explode(':', stream_socket_get_name($connect, true)); //получаем адрес клиента
    $info['ip'] = $address[0];
    $info['port'] = $address[1];

    if (empty($info['Sec-WebSocket-Key'])) {
        return false;
    }

    //отправляем заголовок согласно протоколу вебсокета
    $SecWebSocketAccept = base64_encode(pack('H*', sha1($info['Sec-WebSocket-Key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
        "Upgrade: websocket\r\n" .
        "Connection: Upgrade\r\n" .
        "Sec-WebSocket-Accept:$SecWebSocketAccept\r\n\r\n";
    fwrite($connect, $upgrade);

    return $info;
}

function encode($payload, $type = 'text', $masked = false){
    $frameHead = array();
    $payloadLength = strlen($payload);

    switch ($type) {
        case 'text':
            // first byte indicates FIN, Text-Frame (10000001):
            $frameHead[0] = 129;
            break;

        case 'close':
            // first byte indicates FIN, Close Frame(10001000):
            $frameHead[0] = 136;
            break;

        case 'ping':
            // first byte indicates FIN, Ping frame (10001001):
            $frameHead[0] = 137;
            break;

        case 'pong':
            // first byte indicates FIN, Pong frame (10001010):
            $frameHead[0] = 138;
            break;
    }

    // set mask and payload length (using 1, 3 or 9 bytes)
    if ($payloadLength > 65535) {
        $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
        $frameHead[1] = ($masked === true) ? 255 : 127;
        for ($i = 0; $i < 8; $i++) {
            $frameHead[$i + 2] = bindec($payloadLengthBin[$i]);
        }
        // most significant bit MUST be 0
        if ($frameHead[2] > 127) {
            return array('type' => '', 'payload' => '', 'error' => 'frame too large (1004)');
        }
    } elseif ($payloadLength > 125) {
        $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
        $frameHead[1] = ($masked === true) ? 254 : 126;
        $frameHead[2] = bindec($payloadLengthBin[0]);
        $frameHead[3] = bindec($payloadLengthBin[1]);
    } else {
        $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
    }

    // convert frame-head to string:
    foreach (array_keys($frameHead) as $i) {
        $frameHead[$i] = chr($frameHead[$i]);
    }
    if ($masked === true) {
        // generate a random mask:
        $mask = array();
        for ($i = 0; $i < 4; $i++) {
            $mask[$i] = chr(rand(0, 255));
        }

        $frameHead = array_merge($frameHead, $mask);
    }
    $frame = implode('', $frameHead);

    // append payload to frame:
    for ($i = 0; $i < $payloadLength; $i++) {
        $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
    }

    return $frame;
}

function decode($data){
    $unmaskedPayload = '';
    $decodedData = array();

    // estimate frame type:
    $firstByteBinary = sprintf('%08b', ord($data[0]));
    $secondByteBinary = sprintf('%08b', ord($data[1]));
    $opcode = bindec(substr($firstByteBinary, 4, 4));
    $isMasked = ($secondByteBinary[0] == '1') ? true : false;
    $payloadLength = ord($data[1]) & 127;

    // unmasked frame is received:
    if (!$isMasked) {
        return array('type' => '', 'payload' => '', 'error' => 'protocol error (1002)');
    }

    switch ($opcode) {
        // text frame:
        case 1:
            $decodedData['type'] = 'text';
            break;

        case 2:
            $decodedData['type'] = 'binary';
            break;

        // connection close frame:
        case 8:
            $decodedData['type'] = 'close';
            break;

        // ping frame:
        case 9:
            $decodedData['type'] = 'ping';
            break;

        // pong frame:
        case 10:
            $decodedData['type'] = 'pong';
            break;

        default:
            return array('type' => '', 'payload' => '', 'error' => 'unknown opcode (1003)');
    }

    if ($payloadLength === 126) {
        $mask = substr($data, 4, 4);
        $payloadOffset = 8;
        $dataLength = bindec(sprintf('%08b', ord($data[2])) . sprintf('%08b', ord($data[3]))) + $payloadOffset;
    } elseif ($payloadLength === 127) {
        $mask = substr($data, 10, 4);
        $payloadOffset = 14;
        $tmp = '';
        for ($i = 0; $i < 8; $i++) {
            $tmp .= sprintf('%08b', ord($data[$i + 2]));
        }
        $dataLength = bindec($tmp) + $payloadOffset;
        unset($tmp);
    } else {
        $mask = substr($data, 2, 4);
        $payloadOffset = 6;
        $dataLength = $payloadLength + $payloadOffset;
    }

    /**
     * We have to check for large frames here. socket_recv cuts at 1024 bytes
     * so if websocket-frame is > 1024 bytes we have to wait until whole
     * data is transferd.
     */
    if (strlen($data) < $dataLength) {
        return false;
    }

    if ($isMasked) {
        for ($i = $payloadOffset; $i < $dataLength; $i++) {
            $j = $i - $payloadOffset;
            if (isset($data[$i])) {
                $unmaskedPayload .= $data[$i] ^ $mask[$j % 4];
            }
        }
        $decodedData['payload'] = $unmaskedPayload;
    } else {
        $payloadOffset = $payloadOffset - 4;
        $decodedData['payload'] = substr($data, $payloadOffset);
    }

    return $decodedData;
}

//пользовательские сценарии:

function onOpen($connect, $info) {
    echo "open\n";
    var_dump($info);
    fwrite($connect, encode('Соединение установлено!'));
}

function onClose($connect) {
    echo "close\n";
}

function onMessage($connect, $data,$info) {
    var_dump($info);
    echo decode($data)['payload'] . "\n";
    fwrite($connect, encode('так'));
}

По мотивам: https://habrahabr.ru/post/209864/ и https://learn.javascript.ru/websockets

Обмен информацией между серверами на PHP

Задача: получить данные с сервера, без использования apache

Решение: воспользуемся сокетами на php, а точнее поднимем свой «веб сервер», единственной функцией которго, будет на любой запрос отвечать требуемыми нам данными

Код сервера:

#!/usr/local/bin/php
<?php

function GetCurrentTraf($ent){    
    $current_speed = `/usr/bin/netstat -nbI $ent | grep 'Link' | awk '{print $8}'`;     
    $current_speed=rtrim($current_speed);
    return $current_speed;
};

$socket = stream_socket_server("tcp://0.0.0.0:800", $errno, $errstr);

if (!$socket) {
    die("$errstr ($errno)\n");
}

while ($connect = stream_socket_accept($socket, -1)) {

    $current_traf = GetCurrentTraf("iя0");
    $current_time = time();  
    $json_data = array ('speed'=>$current_traf,'time'=>$current_time);
    $jsonen=json_encode($json_data);
    fwrite($connect, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n $jsonen");
    fclose($connect);
}

fclose($socket);

Код клиента:

  $json = file_get_contents($external_traff_url);  
  $obj=json_decode($json);
  $current_speed=$obj->speed;
      echo "--текущий трафик на интерфейсе : $current_speed (внешний)\n";

Запуск единственной копии скрипта на php

Задача: в кроне с некой периодичностью запускается скрипт на php. Однако он не всегда успевает завершится за минуту. Соответственно нужно добиться того, чтобы скрипт не запускался повторно, в том случае если предыдущий скрипт еще не завершился.

Решение: при каждом запуске скрипта будем при помощи fopen пробовать открыть некий файл (и создавать его в случае отсутствия). После чего будем проверять — а не открыт ли он уже еще кем-то. Если открыт — думаем что открыт другой копией скрипта, и благополучно завершаем свою работу.

$fl = fopen( ‘/tmp/shaper_new.lock’, ‘w’ );

if( ! ( $fl && flock( $fl, LOCK_EX | LOCK_NB ) ) ) {die("--копия скрипта уже запущена!");};

В принципе можно и считать запущеные копии при помощи ps -ax | grep name_script | wc -l, но почему то у меня сиё работало не надежно..