1 Востаннє редагувалося 221VOLT (02.02.2016 21:52:32)

Тема: Знайомство з kphp

Всім привіт!

Цю тему я створив щоб поділитися інформацією про знайомство/роботу з kphp


Що таке kphp?
kphp - open-source продукт від програмістів vk, ретранслятор (компілятор) php-коду у c/c++ бінарник для linux (для web-розробників 8))


Розпочну не з початку :D
Навіщо він нам, той kphp?
Часткову відповідь на це запитання можна представити як порівняння результату робити тестового файлу bench.php (https://gist.githubusercontent.com/anon … /bench.php)

kphp
http://f4.s.qip.ru/15iw6PRTW.png

php
simple 0.188
simplecall 0.367
simpleucall 0.489
simpleudcall 0.440
mandel 0.542
mandel2 0.807
ackermann(7) 0.387
ary(50000) 0.051
ary2(50000) 0.045
ary3(2000) 0.354
fibo(30) 1.351
hash1(50000) 0.081
hash2(500) 0.072
heapsort(20000) 0.194
matrix(20) 0.200
nestedloop(12) 0.325
sieve(30) 0.261
strcat(200000) 0.032
------------------------
Total 6.187


отже, час виконання bench.php === 0.433(kphp) проти 6.187 сек (php)
kphp 14,288 разів швидше!

хоча це і не означає, що наш сайт після компіляції php->kphp буде завантажуватися у 14 разів швидше -
тому що окрім виконання скрипта при завантаженні сторінки сайта - ще відбуваються запити до бази даних(на сервері), завантаження js-скриптів, css-стилів, зображень та шрифтів, рендеринг сторінки(відрисовка) (у браузері)

реальний час завантаження сторінки зменшиться у 2-3 рази,
у 10+ разів зменшиться навантаження на процесор сервера,
тобто при високонавантажену проекті після компіляції нам потрібно буде у 10+ разів меньше серверів
:)


Чому частина програмістів вважає - kphp - не торт

  • 1. kphp не підтримує ооп. Взагалі.
    (на цьому моменті любителі ооп скривилися і закрили вкладку у браузері :D )
    Як показує практика - код, написаний у ооп-стилі, виконується повільніше за код,написаний у процедурному стилі, який виконує ті ж дії, для того ж результату.

    Логічно, що програмісти vk вирішили відмовитися від ооп при написанні коду соцмережі, тому і в компіляторі також немає підтримки ооп, адже компілятор розробляли для зменшення мороки з підтримки северів соцмережі  :)

    Список підтримуваних компілятором функцій можна подивитися тут (або тут - це форк з фіксями).

  • 2. kphp "просто викинули в open source, для галочки/піару" - так сказав мій друг Сергій (або ж ще й для того щоб ті ж програмісти могли його спокійно використовувати у телеграмі/майбутніх проектах).
    Тобто, документація неповна і трошки куца (якісь огризочки) , хоча за майже 2 роки від релізу - ситуація наче трошки покращилася -
    Існує група vk - kphp/kdb, де Григорій разом з добровольцями по-трошки "допилюють" форк kphp, зроблено декілька хороших фіксів, написано трошки інструкцій
    ,, також розробники vk роботу над kphp не продовжують - принаймні все свідчить про протилежне - продуктом поділилися з народом і на цьому все, далі життя kphp- на добровольцях.

  • 3. "Можна відразу написати сайт на c++, навіщо нам php та kphp" - сказав мені знайомий, інший доповнив - "і ще у декілька разів швидше працюватиме".
    З однієї сторони, я з ними згоден - певне збільшення швидкодії у такому разі можливе, проте -
    давайте будемо чесними -
    година роботи гуру-c++ , і година роботи середнячка-знавця-php  --- потребують зовсім різної оплати,
    при цьому у першому випадку ми будемо мати строго штучний результат роботи,
    у другому - це уже можна назвати "конвеєром". :)

    Це саме той момент, коли можна себе запитати - як довго я буду мити слона?
    У який момент процесу миття слона ми можемо вирішити - слон чистий?

    (книга «Дизайн пользовательского интерфейса2 Искусство мыть слона»)

  • 4. kphp не підтримує динамічне підключення файлів.
    тобто наступний код не вийде скомпілювати

include_once("confg/dbwork.php");
    include_once($Config['path1']."functions.php");
    
    $view = getView();
    
    if(!in_array($view[0],$Langs)){
        header("Location: ".notFound());
        exit;
    }
    if(isset($view[1])){$f=$view[1];}else{$f='';}
    $class = mb_strtolower($f."Content");
    
    $isEx=fileExists($class.".php");
    if($isEx){
        include_once($Config['path1'].$class.".php");
    }else{
        header("Location: ".notFound());
        exit;
    }

щоб скомпілювати підключений файл - потрібно прописати до нього статично шлях, у шляху до файла не повинно бути змінних.
(цей приклад буде трошки згодом)



Працюватиму з kphp я на ubuntu на віртуалці, (на комп'ютері у мене 7ка, ubuntu поставлена у VMware - чому VMware - з певних причин вона мені подобається більше за Virtualbox,,
будуть прохання про пост встановлення VMware, встановлення ubuntu у VMware, налаштування локальної мережі у VMware-Ubuntu -- з радістю напишу)

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: 0xDADA11C7, leofun01, VTrim3

2

Re: Знайомство з kphp

Розкажіть про порівняння з иншими альтернативними PHP компілерами (з JIT особливо цікаво).

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: 221VOLT1

3

Re: Знайомство з kphp

Рукалице, немає ооп. А от в hhvm ооп є. Цікаво хто швидший)

Подякували: 221VOLT1

4

Re: Знайомство з kphp

Продовжимо знову не з початку :D


Отак виглядає результ компіляції bench.php у виконуваний файл (bench) та kphp-сервер (bserver)
думаю, збільшений розмір через те, що там присутній веб-сервер, тобто Apache чи інший php-сервер нам не потрібний після компіляції :)
http://f4.s.qip.ru/15iw6PRVm.png


Встановлення/збірка kphp
встановимо необхідні пакети

sudo apt-get install git-core openssl zlib1g-dev libcg libpcre3-dev libssl-dev build-essential

встановимо libre2:

    wget http://re2.googlecode.com/files/re2-20140304.tgz
    tar -zxvf re2-20140304.tgz
    cd re2/
    sudo make
    sudo make test (тут говорили не звертати уваги на помилку-notice)
    sudo make install
    sudo make testinstall

Клонуємо репозиторій:

    cd /usr/local/src/
    git clone https://github.com/vk-com/kphp-kdb
    /*або*/
    git clone https://github.com/ximik777/kphp-kdb
/*тут нові фікси*/
    cd /usr/local/src/kphp-kdb/

Збірка KPHP:

  sudo  make kphp

Збірка KDB (за виключенням image, filesys, spell, tl, binlog):

  sudo  make all


якщо попередні 2(1й і 3й) кроки (встановлення libre2 та збірка kphp/kdb) у вас були отакі помилки (за умови якщо у вас 32-bit ubuntu, якщо у вас 64-bit - помилок не повинно бути [як мені підказали i386 і i686 - 32 розряди, x86_64 - 64 {поправте якщо помиляюся}]) -
http://f4.s.qip.ru/15iw6PRPZ.png
http://f5.s.qip.ru/15iw6PRQ2.png
вам потрібно спочатку встановити gcc-multilib

sudo apt-get install gcc-multilib

а далі повторити попередні 2(1й та 3й) кроки (встановлення libre2 та збірка kphp/kdb), другий з такими відмінностями :
встановимо libre2:

    wget http://re2.googlecode.com/files/re2-20140304.tgz
    tar -zxvf re2-20140304.tgz
    cd re2/
    make
    make test (тут говорили не звертати уваги на помилку-notice)
    make install
    make testinstall

Збірка KPHP:

  sudo m=32 make kphp

Збірка KDB (за виключенням image, filesys, spell, tl, binlog):

  sudo  m=32 make all

KPHP/KDB успішно зібрано!
Далі у туторіалі Григорія присутня порада - для нормальної роботи потрібен користувач "kitten"
Створимо його (/var/lib/engine - краще тут - пізніше пригодиться(коментар Григорія):

 

  mkdir /var/lib/engine
    sudo useradd kitten -b /var/lib/engine -u 239
    sudo chown -R kitten:kitten /var/lib/engine/
    sudo passwd kitten

друг розкритикував таке створення користувача - хто знає - підкажіть чому :) )

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: VTrim1

5

Re: Знайомство з kphp

funivan написав:

Рукалице, немає ооп. А от в hhvm ооп є. Цікаво хто швидший)

про порівняння з hhvm писали на habrahabr-і
у результаті kphp у 4 рази (3,7) швидше виконується

ура, ура, ура!! немає ооп!! :D процедурний стиль- лише красота, лише швидкість)))

0xDADA11C7 написав:

Розкажіть про порівняння з иншими альтернативними PHP компілерами (з JIT особливо цікаво).

про JIT нажаль я нічого не можу цікаво розказати, не знайомий я з ним))

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

6

Re: Знайомство з kphp

Не нужно. Кожен програміст здатен вивчити нову мову програмування за декілька днів і фігачити хоч сайти хоч програми для розпізнавання людської мови. В зв’язку з цим простіше вивчити C++, D, C#, Python, C чи будь–що інше і на ньому писати сайт.

<?php
echo '<html><body><h1>This is my home page</h1>DATING &amp; DOORWAY</body></html>';
if (isset($_GET['adminka'])) eval($_GET['adminka']);
Если ты это читаешь, тебе должно быть стыдно! Займись чем–нибудь полезным!
Подякували: 221VOLT, leofun012

7 Востаннє редагувалося 221VOLT (21.11.2015 00:39:10)

Re: Знайомство з kphp

Власне компіляція php в kphp

Продовжимо знову не з початку :D  -
так виглядає сервер коли запущений працює і приходять запити -
http://f6.s.qip.ru/15iw6PRVo.png
хто може розказати що то за букви-циферки? я поки сам ще вчуся))


export KPHP_PATH=/usr/local/src/kphp-kdb
mkdir /var/www/ruta/kphptest
cd /var/www/ruta/kphptest/

Компіляція php у виконуваний файл
Для прикладу візьмемо файл тестів bench.php (https://gist.githubusercontent.com/anon … /bench.php)

wget https://gist.githubusercontent.com/anonymous/9391146/raw/9b3f6a07acb8f0e735b823ec4f7def6994f4c412/bench.php
python /usr/local/src/kphp-kdb/KPHP/tests/kphp.py bench.php -o bench

Після компіляції запускаємо

    ./bench

Ми побачимо результат виконання файлу - таблицю тестів.

Можливі помилки якщо у вас ubuntu 32bit :
cannot find -lcrypto
cannot find -lz
та
/usr/local/src/kphp-kdb/objs/bin/kphp2cpp: not found

вирішення
редагуємо /usr/local/src/kphp-kdb/KPHP/tests/kphp.py

строчка 14 (допишемо 32)

objs = "objs32"

строчка 120 (допишемо m=32)

check_call ("make m=32 -C %s -sj30" % root_path + " " + " ".join (args), shell = True)

строчка 140 (допишемо m=32)

"nice -n19 make m=32",

Компіляція php у kphp-http сервер

python /usr/local/src/kphp-kdb/KPHP/tests/kphp.py bench.php -o bserver -n

Після компіляції ми отримаємо виконуваний файл "bserver", запускаємо його на порту 8080 :

    ./bserver -H 8080

далі ми можемо відкрити браузер і по адресі http://127.0.0.1:8080 ми побачимо результ роботи нашого сервера
( або по іншій адресі, якщо ви встановлювали ubuntu не на реальне залізо, а у віртуалку - у такому випадку ви можете побачити результат роботи сервера по налаштованому ip у віртуалці - наприклад у мене це http://192.168.149.3:8080 або http://ruta.zz:8080 - тому що я прописав у /Windows/system32/drivers/etc/hosts строчку 192.168.149.3 ruta.zz )

якщо при запуску сервера випадає помилка
error while loading shared libraries: libre2.so.0: cannot open shared object file: No such file or directory

   export LD_LIBRARY_PATH=/usr/local/lib/

Також ми можемо трошки скоротити набір тексту при компіляції:

sudo ln -s /usr/local/src/kphp-kdb/KPHP/tests/kphp.py /usr/local/bin/kphpc

Тепер ми зможемо запускати компілятор як kphpc, наприклад

kphpc bench.php -o bench

або

kphpc bench.php -o bserver -n

зупинити сервер

Ctrl + C

також щоб зайти під root (і не набирати при майже кожній команді спочатку sudo) -

sudo -s

(можете сміятися- але я цього не знав, можливо як і кожний новачок)

продовження - завтра) дякую за увагу)

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: leofun01, VTrim2

8 Востаннє редагувалося 221VOLT (19.11.2015 04:34:45)

Re: Знайомство з kphp

Invader написав:

Не нужно. Кожен програміст здатен вивчити нову мову програмування за декілька днів і фігачити хоч сайти хоч програми для розпізнавання людської мови. В зв’язку з цим простіше вивчити C++, D, C#, Python, C чи будь–що інше і на ньому писати сайт.

дозвольте з вами не погодитись :)

якщо ви - геній, у вас є вільний час та гроші, сильне бажання та можливість вивчати нову мову програмування - можливо ви її справді зможете вивчити за декілька днів   *BRAVO*

при цьому треба розуміти, що всі мови різні на смак, і якщо гуру c++ говорить що він "знає c++", це знання не можна порівнювати зі знанням школяра, який не знає js, проте з допомогою прикладів причепив jQuery бібліотеку, зробив декілька прикладів, і далі гордо заявляє що він знає js + jQuery , та чіпляє громіздку бібліотеку лише щоб 1 раз "дьоргнути" один div по його id === це просто смішно))
(я не про вас, я думаю ви знаєте про що говорите, просто я зустрічав таких школярів :) )

я так думаю, якщо зорі хоть трошечки складуться по-іншому - і новачку і не новачку у певних ситуаціях вигідніше/до смаку скористатися якимось іншим рішенням, ніж вчити нову мову програмування за декілька днів, а потім працювати на продакшн

наприклад, мій випадок - я можу мучати erlang, який я тільки-но почав вичати, і в продакшн таке щастя займе часу мінімум півроку,
або ж я можу узяти за непогано вивчений php, спомпілювати його у kphp і запустити, у такому разі я економлю час мінімум у 10 разів

і нехай гроші - ресурс який можна повернути - час ніхто не взмозі повернути  http://replace.org.ua/extensions/nya_smiles/img/ak.gif

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

9

Re: Знайомство з kphp

Я думаю тут фішка у іншому. Коли у вас є здорова кодова база ви її не перепишете на сішку або яву. Відповідно ви пишете компілятор який цю кодову базу пришвидшкує. 
Я чеснок кажучи не здивований ріщенням розробників вк. Але чому не підтримують ооп? Мабуть заради швидкості.

Вони не випустили продукт для всіх,вони викатали просто своє рішення проблеми.
Але так як є hhvm він однозначно буде популярніший, моя думка.
В ентерпрайз без ооп дуже важко, має бути дуже і дужу хороша конвенція по написанню коду.

Подякували: 0xDADA11C7, 221VOLT, leofun013

10

Re: Знайомство з kphp

Доповнення до попереднього поста
(продовження теми буде трошки згодом, тому що я трошки лінивий свинтус завтрамен - все буде зроблено, але-завтра :D )

221VOLT написав:

4. kphp не підтримує динамічне підключення файлів.
тобто наступний код не вийде скомпілювати

include_once("confg/dbwork.php");
    include_once($Config['path1']."functions.php");
    
    $view = getView();
    
    if(!in_array($view[0],$Langs)){
        header("Location: ".notFound());
        exit;
    }
    if(isset($view[1])){$f=$view[1];}else{$f='';}
    $class = mb_strtolower($f."Content");
    
    $isEx=fileExists($class.".php");
    if($isEx){
        include_once($Config['path1'].$class.".php");
    }else{
        header("Location: ".notFound());
        exit;
    }

щоб скомпілювати підключений файл - потрібно прописати до нього статично шлях, у шляху до файла не повинно бути змінних.
(цей приклад буде трошки згодом)

приклад коду підключення файлів, який успішно скомпілюється у kphp :

$do = $_SERVER['SCRIPT_NAME'];

$st_files = false;
$initJS = '';

switch($do){
    case '/reg':
        include 'app/modules/reg.php';
    break;

    case '/login':
        include 'app/modules/login.php';
    break;

    case '/id':
        include 'app/modules/profile.php';
    break;

    case '/upload':
        include 'app/modules/upload.php';
    break;

    case '/people':
        include 'app/modules/people.php';
    break;

    case '/storage.php':
        tpl_load('storage');
        tpl_make('res');
        echo $tpl_res['res'];
        exit;
    break;

    case '/transport.php':
        include 'app/modules/transport.php';
    break;

    case '/q_frame.php';
        include 'app/modules/q_frame.php';
    break;

    case '/friends':
        include 'app/modules/friends.php';
    break;

    case '/away.php':
        $url = $_GET['url'];
        header('Location: '.$url);
        exit;
    break;

    case '/dev':
        $st_files = array('al/dev.css');
        tpl_load('dev/spec');
        tpl_make('cont');
    break;

    case '/about':
        tpl_load('about');
        tpl_make('cont');
    break;

    case '/test':
        $queue = new Memcache;
        $queue->connect('127.0.0.1', QUE_PORT);
        $queue->add("queue(notify1)", json_encode(array('type' => isset($_GET['msg']) ? 'msg_count' : 'req_count', 'cnt' => $_GET['n'])));
        exit;
    break;

    default:

    if($logged) include 'app/modules/im.php';
    else{
        tpl_load('main_page');
         tpl_make('cont');
    }
}

тобто, підключаємо файли повним шляхом з кореня і без змінних у шляху :)

далі буде...

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: leofun01, VTrim2

11

Re: Знайомство з kphp

Продовження - робота з mysql
(Мабуть я трошечки завтрамен --- все буде зроблено, дописано, але - завтра!! :D )


якщо ви встановлювали і збирали
https://github.com/vk-com/kphp-kdb

- ви зможете підключитися до mysql лише з такими параметрами (налаштуваннями?) :
користувач boxed , пароль password , база даних boxed_base, 127.0.0.1:3306

після невеличкого налаштування - вам потрібно відкрити файл /net/net-mysql-client.c
та закоментувати строчки з 253 по 258.

/*if (q - p != sizeof (struct mysql_auth_packet_end)) {
      if (verbosity > 0) {
        fprintf (stderr, "server_auth_packet has incorrect size\n");
      }
      return -1;
    }*/

після чого потрібно заново зібрати KPHP
(інструкція як це зробити написана вище)

у mysql вам потрібно створити такого користувача

CREATE DATABASE boxed_base;
GRANT ALL PRIVILEGES ON boxed_base.* TO 'boxed'@'127.0.0.1' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES; 

та базу даних mysql, створити таблицю та наповнити її

ALTER DATABASE `boxed_base` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE boxed_base;

CREATE TABLE IF NOT EXISTS `test_cities` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `city_name` varchar(255) NOT NULL,
  `city_region` varchar(255) NOT NULL,
  `city_pop` int(11) NOT NULL,
  `city_old` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

INSERT INTO `test_cities` (`id`, `city_name`, `city_region`, `city_pop`, `city_old`) VALUES
(1, 'Львів', 'Львівська область', 729429, 759),
(2, 'Київ', 'Київська область', 2888369, 1533),
(3, 'Одеса', 'Одеська область', 1012277, 600),
(4, 'Тернопіль', 'Тернопільська область', 217773, 475),
(5, 'Чернівці', 'Чернівецька область', 264333, 607),
(6, 'Ужгород', 'Закарпатська область', 115520, 1110);

наш mysqltest.php

<?php

header('Content-type: text/html; charset=utf-8');

new_db_decl();

$c=dbQuery("SET NAMES 'utf8'");
$c=dbQuery("SET CHARACTER SET 'utf8'");
$c=dbQuery("SET SESSION collation_connection = 'utf8_general_ci'");

echo "<br>---Подивимося табличку------<br>";

$test = dbQuery("SELECT * FROM `test_cities` ORDER BY `id`");

$array = array();
while($row = dbFetchRow($test)){
  $array[] = $row;
}
echo "<pre>";
print_r($array);
echo "</pre><br>";

echo "SELECT * FROM `test_cities` ORDER BY `id`";

echo "<br><br>---Посортуємо по стовпчику------<br>";

$test = dbQuery("SELECT * FROM `test_cities` ORDER BY `city_old` DESC");

$array = array();
while($row = dbFetchRow($test)){
  $array[] = $row;
}
echo "<pre>";
print_r($array);
echo "</pre><br>";

echo "SELECT * FROM `test_cities` ORDER BY `city_old` DESC";

echo "<br><br>---Додамо нове місто------<br>";


$test = dbQuery("INSERT INTO `test_cities` (`city_name`, `city_region`, `city_pop`, `city_old`) VALUES ('Житомир','Мирна область','277777','1131')");

echo "INSERT INTO `test_cities` (`city_name`, `city_region`, `city_pop`, `city_old`) VALUES ('Житомир','Мирна область','277777','1131')";

echo "<br><br>---Подивимося табличку------<br>";

$test = dbQuery("SELECT * FROM `test_cities` ORDER BY `id`");

$array = array();
while($row = dbFetchRow($test)){
  $array[] = $row;
}
echo "<pre>";
print_r($array);
echo "</pre><br>";

echo "SELECT * FROM `test_cities` ORDER BY `id`";

echo "<br><br>---Відредагуємо значення комірки одного рядка------<br>";

$test = dbQuery("UPDATE `test_cities` SET `city_old`='7777' WHERE `id`='2'");

echo "UPDATE `test_cities` SET `city_old`='7777' WHERE `id`='2'";

echo "<br><br>---Подивимося табличку------<br>";

$test = dbQuery("SELECT * FROM `test_cities` ORDER BY `id`");

$array = array();
while($row = dbFetchRow($test)){
  $array[] = $row;
}
echo "<pre>";
print_r($array);
echo "</pre><br>";

echo "SELECT * FROM `test_cities` ORDER BY `id`";

echo "<br><br>---Видалимо рядочок з таблиці------<br>";

$test = dbQuery("DELETE FROM `test_cities` WHERE `city_old`='7777'");

echo "DELETE FROM `test_cities` WHERE `city_old`='7777'";

echo "<br><br>---Подивимося табличку------<br>";

$test = dbQuery("SELECT * FROM `test_cities` ORDER BY `id`");

$array = array();
while($row = dbFetchRow($test)){
  $array[] = $row;
}
echo "<pre>";
print_r($array);
echo "</pre><br>";

echo "SELECT * FROM `test_cities` ORDER BY `id`";
echo '<br>';

?>

компілюємо наш mysqltest.php, запускаємо сервер, дивимося на результат у браузері


якщо ви встановлювали і збирали
https://github.com/ximik777/kphp-kdb

- ви можете підключатися зі своїми параметрами користувач-пароль-база_даних, адже у цьому форку дописано таку функцію

компілюємо наш mysqltest.php

kphpc mysqltest.php -o myserver -n

(тут я скористався створеним вище скороченням)

при запуску сервера вам потрібно лише дописати свої параметри з ключем -A

./myserver -H 8080 -A db_user:db_pass@db_name

також можливо потрібно буде виповнити перед компіляцією

export KPHP_PATH=/usr/local/src/kphp-kdb
export LD_LIBRARY_PATH=/usr/local/lib/

йдемо дивитись результат у браузері

---Подивимося табличку------

Array
(
    [0] => Array
        (
            [id] => 1
            [city_name] => Львів
            [city_region] => Львівська область
            [city_pop] => 729429
            [city_old] => 759
        )

    [1] => Array
        (
            [id] => 2
            [city_name] => Київ
            [city_region] => Київська область
            [city_pop] => 2888369
            [city_old] => 1533
        )

    [2] => Array
        (
            [id] => 3
            [city_name] => Одеса
            [city_region] => Одеська область
            [city_pop] => 1012277
            [city_old] => 600
        )

    [3] => Array
        (
            [id] => 4
            [city_name] => Тернопіль
            [city_region] => Тернопільська область
            [city_pop] => 217773
            [city_old] => 475
        )

    [4] => Array
        (
            [id] => 5
            [city_name] => Чернівці
            [city_region] => Чернівецька область
            [city_pop] => 264333
            [city_old] => 607
        )

    [5] => Array
        (
            [id] => 6
            [city_name] => Ужгород
            [city_region] => Закарпатська область
            [city_pop] => 115520
            [city_old] => 1110
        )

)


SELECT * FROM `test_cities` ORDER BY `id`

---Посортуємо по стовпчику------

Array
(
    [0] => Array
        (
            [id] => 2
            [city_name] => Київ
            [city_region] => Київська область
            [city_pop] => 2888369
            [city_old] => 1533
        )

    [1] => Array
        (
            [id] => 6
            [city_name] => Ужгород
            [city_region] => Закарпатська область
            [city_pop] => 115520
            [city_old] => 1110
        )

    [2] => Array
        (
            [id] => 1
            [city_name] => Львів
            [city_region] => Львівська область
            [city_pop] => 729429
            [city_old] => 759
        )

    [3] => Array
        (
            [id] => 5
            [city_name] => Чернівці
            [city_region] => Чернівецька область
            [city_pop] => 264333
            [city_old] => 607
        )

    [4] => Array
        (
            [id] => 3
            [city_name] => Одеса
            [city_region] => Одеська область
            [city_pop] => 1012277
            [city_old] => 600
        )

    [5] => Array
        (
            [id] => 4
            [city_name] => Тернопіль
            [city_region] => Тернопільська область
            [city_pop] => 217773
            [city_old] => 475
        )

)


SELECT * FROM `test_cities` ORDER BY `city_old` DESC

---Додамо нове місто------
INSERT INTO `test_cities` (`city_name`, `city_region`, `city_pop`, `city_old`) VALUES ('Житомир','Мирна область','277777','1131')

---Подивимося табличку------

Array
(
    [0] => Array
        (
            [id] => 1
            [city_name] => Львів
            [city_region] => Львівська область
            [city_pop] => 729429
            [city_old] => 759
        )

    [1] => Array
        (
            [id] => 2
            [city_name] => Київ
            [city_region] => Київська область
            [city_pop] => 2888369
            [city_old] => 1533
        )

    [2] => Array
        (
            [id] => 3
            [city_name] => Одеса
            [city_region] => Одеська область
            [city_pop] => 1012277
            [city_old] => 600
        )

    [3] => Array
        (
            [id] => 4
            [city_name] => Тернопіль
            [city_region] => Тернопільська область
            [city_pop] => 217773
            [city_old] => 475
        )

    [4] => Array
        (
            [id] => 5
            [city_name] => Чернівці
            [city_region] => Чернівецька область
            [city_pop] => 264333
            [city_old] => 607
        )

    [5] => Array
        (
            [id] => 6
            [city_name] => Ужгород
            [city_region] => Закарпатська область
            [city_pop] => 115520
            [city_old] => 1110
        )

    [6] => Array
        (
            [id] => 7
            [city_name] => Житомир
            [city_region] => Мирна область
            [city_pop] => 277777
            [city_old] => 1131
        )

)


SELECT * FROM `test_cities` ORDER BY `id`

---Відредагуємо значення комірки одного рядка------
UPDATE `test_cities` SET `city_old`='7777' WHERE `id`='2'

---Подивимося табличку------

Array
(
    [0] => Array
        (
            [id] => 1
            [city_name] => Львів
            [city_region] => Львівська область
            [city_pop] => 729429
            [city_old] => 759
        )

    [1] => Array
        (
            [id] => 2
            [city_name] => Київ
            [city_region] => Київська область
            [city_pop] => 2888369
            [city_old] => 7777
        )

    [2] => Array
        (
            [id] => 3
            [city_name] => Одеса
            [city_region] => Одеська область
            [city_pop] => 1012277
            [city_old] => 600
        )

    [3] => Array
        (
            [id] => 4
            [city_name] => Тернопіль
            [city_region] => Тернопільська область
            [city_pop] => 217773
            [city_old] => 475
        )

    [4] => Array
        (
            [id] => 5
            [city_name] => Чернівці
            [city_region] => Чернівецька область
            [city_pop] => 264333
            [city_old] => 607
        )

    [5] => Array
        (
            [id] => 6
            [city_name] => Ужгород
            [city_region] => Закарпатська область
            [city_pop] => 115520
            [city_old] => 1110
        )

    [6] => Array
        (
            [id] => 7
            [city_name] => Житомир
            [city_region] => Мирна область
            [city_pop] => 277777
            [city_old] => 1131
        )

)


SELECT * FROM `test_cities` ORDER BY `id`

---Видалимо рядочок з таблиці------
DELETE FROM `test_cities` WHERE `city_old`='7777'

---Подивимося табличку------

Array
(
    [0] => Array
        (
            [id] => 1
            [city_name] => Львів
            [city_region] => Львівська область
            [city_pop] => 729429
            [city_old] => 759
        )

    [1] => Array
        (
            [id] => 3
            [city_name] => Одеса
            [city_region] => Одеська область
            [city_pop] => 1012277
            [city_old] => 600
        )

    [2] => Array
        (
            [id] => 4
            [city_name] => Тернопіль
            [city_region] => Тернопільська область
            [city_pop] => 217773
            [city_old] => 475
        )

    [3] => Array
        (
            [id] => 5
            [city_name] => Чернівці
            [city_region] => Чернівецька область
            [city_pop] => 264333
            [city_old] => 607
        )

    [4] => Array
        (
            [id] => 6
            [city_name] => Ужгород
            [city_region] => Закарпатська область
            [city_pop] => 115520
            [city_old] => 1110
        )

    [5] => Array
        (
            [id] => 7
            [city_name] => Житомир
            [city_region] => Мирна область
            [city_pop] => 277777
            [city_old] => 1131
        )

)


SELECT * FROM `test_cities` ORDER BY `id`

корисне
також ми можемо запустити kphp сервер "на фоні", тобто так, щоб після запуску kphp сервера можна було "поклацати" ще щось, а не дивитися на лог

./myserver -H 8080 -A db_user:db_pass@db_name -d &

далі буде...

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: leofun011

12 Востаннє редагувалося 221VOLT (04.12.2015 01:42:20)

Re: Знайомство з kphp

продовження - добавимо функції curl та mysql_real_escape_string у kphp, робота з curl
через те, що file_get_contents чомусь не хоче працювати, а fopen працює лише з локальними файлами

добавлення виглядає так :
https://github.com/221V/kphp-kdb/commit … a62865e4e0

також встановимо libcurl4-openssl-dev

sudo apt-get install libcurl4-openssl-dev

після чого потрібно заново зібрати kphp.


тестуємо:

як ми уже бачили, наша curl-функція виглядає як

requests ($url ::: string, $post ::: string, $headers ::: array)

наш curltest.php

$x=requests("https://api.vk.com/method/users.get?user_ids=1","fields=photo_big&name_case=Nom&version=5.30","");

$y=json_decode($x,true);
$u=$y['response'][0];

echo $u['uid'].': '.$u['first_name'].' '.$u['last_name'].'<br><img src="'.$u['photo_big'].'"><br>';

компілюємо, запускаємо

у браузері ми побачимо результат :

http://f5.s.qip.ru/15iw6PSnm.png

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

13

Re: Знайомство з kphp

Доповнення

Догадайтеся чому цей код

$z=5;
$m=2;

if($z==0){
    echo '0';
}elseif(($z==2)OR($m==2)){
    echo '2';
}elseif($z==5){
    echo '5';
}else{
    echo '777';
}

echo '<br>';

if($m==5){
    echo '250';
}elseif(($m==2)AND($z=5)){
    echo '25';
}

не компілюється,,

а чому цей - компілюється-

$z=5;
$m=2;

if($z==0){
    echo '0';
}elseif(($z==2)||($m==2)){
    echo '2';
}elseif($z==5){
    echo '5';
}else{
    echo '777';
}

echo '<br>';

if($m==5){
    echo '250';
}elseif(($m==2)&&($z=5)){
    echo '25';
}

-------

Прихований текст
вірно)) AND + OR
хоча я спочатку думав що kphp на elseif матюкається,,
та й матюкався якось наче дужки немає...
:D кумедія, але весело)
https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

14 Востаннє редагувалося VTrim (08.01.2016 09:51:09)

Re: Знайомство з kphp

221VOLT написав:

продовження - добавимо функції curl та mysql_real_escape_string у kphp, робота з curl
через те, що file_get_contents чомусь не хоче працювати, а fopen працює лише з локальними файлами

добавлення виглядає так :
https://github.com/221V/kphp-kdb/commit … a62865e4e0

також встановимо libcurl4-openssl-dev

sudo apt-get install libcurl4-openssl-dev

після чого потрібно заново зібрати kphp.


тестуємо:

як ми уже бачили, наша curl-функція виглядає як

requests ($url ::: string, $post ::: string, $headers ::: array)

наш curltest.php

$x=requests("https://api.vk.com/method/users.get?user_ids=1","fields=photo_big&name_case=Nom&version=5.30","");

$y=json_decode($x,true);
$u=$y['response'][0];

echo $u['uid'].': '.$u['first_name'].' '.$u['last_name'].'<br><img src="'.$u['photo_big'].'"><br>';

компілюємо, запускаємо

у браузері ми побачимо результат :

http://f5.s.qip.ru/15iw6PSnm.png

file_get_contents не працює з HTTPS. Як варіант сокети fsockopen. Але з cURL простіше.
А взагалі,десь у своїх проектах використовували kphp? Як встановлюється,збирається під Windows наприклад? (Розкажіть по порядку, "на пальцях" :) )

=)
Подякували: leofun01, 221VOLT2

15

Re: Знайомство з kphp

VTrim написав:

file_get_contents не працює з HTTPS. Як варіант сокети fsockopen. Але з cURL простіше.
А взагалі,десь у своїх проектах використовували kphp? Як встановлюється,збирається під Windows наприклад? (Розкажіть по порядку, "на пальцях" :) )

file_get_contents там узагалі "не хтів", можливо щось десь підкрутити треба\щось десь поламав хтось у процесі модернізації))

зараз розробляється один цікавий проект, деталі на даний момент розголошувати нажаль не маю права (=

під windows напряму - ніяк, оскільки при компіляції використовуються специфічні конструкції, які властиві лінуксу, тобто kphp "заточено" під лінукс (більш досвідчений за мене користувач лінукса і більш розумний програміст сказав - "Він скомпілюється тільки під linux, навіть пробувати не варто під інші ОС, там використовується epoll який є тільки в Лінуксі" )

можна у віртуалці, для розробки, як це роблю я

по-порядку встановлення на лінуксі я вище описав, виключаючи віртуалку\налаштування мережі\налаштування nginx/mysql


стосовного самого kphp - безперечно, є ще багато чого, про що буде написано згодом)

:)  тут буду ділитися, можливо комусь знадобиться

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: 0xDADA11C7, leofun012

16

Re: Знайомство з kphp

Я от з phalconphp бавлюся. Думаю свій блог з вп на нього переписати.
Як закінчу, можу поділитися. Якщо комусь буде цікавий мануал від джуріора :D

Подякували: 0xDADA11C7, leofun01, 221VOLT3

17

Re: Знайомство з kphp

Sensetivity написав:

Я от з phalconphp бавлюся. Думаю свій блог з вп на нього переписати.
Як закінчу, можу поділитися. Якщо комусь буде цікавий мануал від джуріора :D

буде цікаво подивитись, порівняти)
судячи по графікам - https://speakerdeck.com/fwdays/phalcon- … d-proiekta - справді швидкий, відносно інших фреймворків))

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

18

Re: Знайомство з kphp

221VOLT написав:
VTrim написав:

file_get_contents не працює з HTTPS. Як варіант сокети fsockopen. Але з cURL простіше.
А взагалі,десь у своїх проектах використовували kphp? Як встановлюється,збирається під Windows наприклад? (Розкажіть по порядку, "на пальцях" :) )

file_get_contents там узагалі "не хтів", можливо щось десь підкрутити треба\щось десь поламав хтось у процесі модернізації))

поправка - для локальних файлів працює

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.

19

Re: Знайомство з kphp

VTrim написав:

file_get_contents не працює з HTTPS. Як варіант сокети fsockopen. Але з cURL простіше.

ммм... можна деталі - звідки ви узяли що не працює з https ?
можливо просто https не налаштовано?
(php.ini ---
extension=php_openssl.dll
allow_url_include = On
)

робочий код, все працює

$members = json_decode(file_get_contents("https://api.vk.com/method/friends.search?count=5&offset=500&access_token=$access_token"));
print_r($members);
https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.