Pull to refresh

Используем PHP по назначению

Reading time3 min
Views6.3K

upd: Осторожно, текст содержит сатиру и кодобред

Язык программирования PHP берёт своё начало в 1995 году и является продуктом эпохи зарождения современных веб стандартов, таких как http (версия 1.0 — 1996), html (версия 2.0 — 1995), javascript (1995 год), url (1990 — 1994 года). Первоначально аббревиатура php имела расшифровку Personal Home Page Tools, далее трансформировавшись в Hypertext Preprocessor или «препроцессор гипертекста». Об использовании PHP в качестве препроцессора и будет посвящено несколько следующих абзацев.

Интерпретатор PHP позволяет вставлять в любой текст специальные тег <?php ?>, с помощью которого можно подставить в страницу динамический контент, что очень удобно использовать внутри html документов. Полученный результат сразу подаётся на стандартное устройство вывода, известное как stdout (подробнее смотри здесь). Есть возможность буферизовать вывод до востребованности через функцию ob_start, но для нашей первой html страницы это не понадобится. Самый последний стандарт html под номером 5 ввёл несколько новых тегов для упрощения разметки, повышения читаемости и семантичности веба (что бы это не значило). Поэтому сразу воспользуемся всей мощью HTML5 и напишем шаблон страницы со вставками на рассматриваемом препроцессоре.


Сохраним эту страницу в файл index.html. Функционал блога в первой его версии будет предусматривать хранение публикаций в виде html страниц внутри заранее заданной директории (например pages/) и меню позволяющее перейти сразу на нужную публикацию.

Пример публикации, которая будет выведена в ленту блога.


В корне проекта добавим директорию pages/ и сохраним нашу статью под произвольным именем, например как 2018-trends.html.

Теперь нам нужен веб сервер для обработки входящих http запросов от пользователей, и сервер приложения для бизнес логики. Чтобы не плодить лишнии сущности напишем небольшую программу на языке программирования Go, которая будет выступать и в роли веб сервера, и содержать код блога. Для передачи пользовательских запросов из хостовой программы в препроцессор воспользуемся стандартным потоком ввода (stdin), для сериализации данных воспользуемся популярным форматом для сериализации данных — json.

Скрипт для обработки входных данных:

<?php
$input = trim(fgets(STDIN));
$input = json_decode($input, true);
include("index.html");

Код блога:

main.go
package main

import (
	"encoding/json"
	"io/ioutil"
	"net/http"
	"os/exec"
	"strings"

	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/", index)
	e.GET("/pages/:page", index)
	e.Start(":8000")
}

func index(c echo.Context) error {
	outData := struct {
		Menu  []string `json:"menu"`
		Pages []string `json:"pages"`
	}{}
	outData.Menu = make([]string, 0)
	outData.Pages = make([]string, 0)

	page := c.Param("page")

	files, _ := ioutil.ReadDir("pages")
	for _, file := range files {
		if !file.IsDir() {
			outData.Menu = append(outData.Menu, file.Name())
		}
		if page != "" && page == file.Name() {
			fbody, _ := ioutil.ReadFile("pages" + "/" + file.Name())
			outData.Pages = append(outData.Pages, string(fbody))
		} else if page == "" {
			fbody, _ := ioutil.ReadFile("pages" + "/" + file.Name())
			outData.Pages = append(outData.Pages, string(fbody))
		}

	}

	rendered := renderContent(outData)

	return c.HTMLBlob(http.StatusOK, rendered)
}

func renderContent(input interface{}) []byte {
	jsonInput, _ := json.Marshal(input)

	tmplEngine := exec.Command("php", "-f", "index.php")
	tmplEngine.Stdin = strings.NewReader(string(jsonInput))
	rendered, _ := tmplEngine.Output()

	return rendered
}


Теперь запускаем на исполнение программу через go run и делаем запрос на страницу через любой браузер, например таким образом:

links2 http://localhost:8000

Результат представлен на КДПВ.

Пытливый читатель может заметить, что мы сильно теряем в производительности запуская на каждый запрос php процесс. Данный момент легко оптимизировать используя механизм pipes и запуская php процесс единожды в фоне, но это уже совсем другая история.
Tags:
Hubs:
-6
Comments17

Articles