Autor Zpráva
sniclman
Profil
Ahoj,
potřeboval bych poradit s se sloučením PHP scriptů do jednoho souboru.

mám následující soubory:
//test1.php
<?
echo 'toto je první soubor bez ukončení';

//test2.php
<?
echo 'toto je druhý soubor bez ukončení';

A potřebuji z nich udělat tohle:
//sloucenyskript.php
<?
echo 'toto je první soubor bez ukončení';
?>
<?
echo 'toto je druhý soubor bez ukončení';
nebo ideálně
<?
echo 'toto je první soubor bez ukončení';

echo 'toto je druhý soubor bez ukončení';

Předěm děkuji za veškeré nzory a rady.
xaverista
Profil
<?php
include "test1.php";
include "test2.php";
Popřípadě pokud by stránka bez toho daného souboru nefungovala (soubor je klíčový pro správnou funkcionalitu), doporučuji místo include dát require
sniclman
Profil
xaverista:
include, require běžně používám. Potřebuji soubory sloučit (případně ještě nějakým jiným scriptem poupravit, minifikovat atd...) a dát si je do rádoby cache.
Keeehi
Profil
sniclman:
Potřebuji soubory sloučit
Proč? Pochopil bych to u CSS, u JS, případně u šablon. S nutností minifikovat PHP jsem se ještě nesetkal.
Martin2
Profil *
Keeehi:
S nutností minifikovat PHP jsem se ještě nesetkal.
Větší knihovny nebo frameworky se minifikují běžně. Trochu to šetří prostředky serveru a líp se s nimi manipuluje na produkčním serveru. Samotné aplikace/weby se ale takto většinou neupravují.

sniclman:
Potřebuji soubory sloučit (případně ještě nějakým jiným scriptem poupravit, minifikovat atd...) a dát si je do rádoby cache.
Od verze 5.2 umí PHP pracovat s PHP archivy (Phar). Je to přesně to, co požaduješ – komprimovaný archiv souborů, který můžeš celý includovat nebo i transparentně pracovat s jeho částmi pomocí phar stream wrapperu.
sniclman
Profil
Keeehi:
Potřebuji to pro šablonu.

Martin2:
Phar jsem zkoušel, problém je že na serveru je nastaveno phar.readonly = 1. Takže mi achrivování do phar nefunguje.

Tady je phpinfo() nastavení PHAR
Phar EXT version     2.0.1
Phar API version     1.1.1
SVN revision     $Id: 21d763042eb5769ae0a09dc1118df2b5aae6fb33 $
Phar-based phar archives     enabled
Tar-based phar archives     enabled
ZIP-based phar archives     enabled
gzip compression     enabled
bzip2 compression     enabled
Native OpenSSL support     enabled 

phar.cache_list    no value    no value
phar.readonly    On    On
phar.require_hash    On    On

Přístup do php.ini nemám protože se jedná o wehosting od onebit.cz. Nastavení v .user.ini také nefunguje.
Joker
Profil
sniclman:
A je nějaký problém si ten archiv vytvořit u sebe?
sniclman
Profil
Joker:
Manuální vytváření achrivů postrádá jakýkoliv smysl. To bych mohl už rovnou manuálně slučovat všechny soubory. Potřebuji automatizovaný systém.
Martin2
Profil *
sniclman:
Potřebuji automatizovaný systém.
K tomu Phar neslouží. Ujasni si, jestli chceš zjednodušit deployment nebo řešit runtime cache. Ve druhém případě se vykašli na minifikaci a slučování, protože to na to nemá vůbec žádný vliv. Od verze 5.5 obsahuje PHP extenzi Opcache, která akceleruje běh prostředí – pokud ji máš zapnutou, nemá vcelku smysl dělat nic dalšího.
Joker
Profil
sniclman:
Potřebuji automatizovaný systém.
Však se to může dělat klidně automaticky.

Problém by nastal až ve chvíli, kdy by bylo potřeba to dělat opakovaně a dynamicky za běhu aplikace.
Martin2
Profil *
Joker:
Však se to může dělat klidně automaticky.
Na produkčním serveru nebývá nikdy phar.readonly vypnuté, takže automaticky jedině na vývojovém stroji před deploymentem.
Joker
Profil
Martin2:
Ano, tak jsem to myslel. Udělat automaticky na vývojovém stroji a pak přenést.
Dokud není potřeba to dělat dynamicky za běhu aplikace, neměl by být problém.
sniclman
Profil
Co třeba tohle:

//$content = přečtený soubor přes fopen
$content = preg_replace('/<\?(((?!\?>).)*)\?>/s', '', $content);
if(preg_match('/<\?/s', $content, $output)){echo 'Omitted end tag for php';}

detekce zda je php skript ukončen
Vymaže všechny ukončený <?.....?> a zjistí zda je tam někde neukončený <?
Pokud ano tak přidá na konec ?>
pak by se ze sloučených skriptů dalo udělat tohle:
<?
echo 'toto je první soubor bez ukončení';
?>
<?
echo 'toto je druhý soubor bez ukončení';
Joker
Profil
sniclman:
Je nějak dané, co je obsahem těch souborů.
Dovolím si připomenout, že stejné symboly používají procesní instrukce SGML/XML, takže jestli některý ten skript může generovat např. XML kód, asi bych se do toho nepouštěl.

Kromě toho mám zkušenost, že regulární výrazy používající konstrukce jako tvrzení o následujícím bývají docela pomalé.
sniclman
Profil
Joker:
No... není to zrovna štastné řešení. Nenapadá mě žádný jiný způsob jak detekovat konec PHP skriptu.
sniclman
Profil
Update vyhledávání neukončených PHP tagů

preg_match_all('/\<\?((?!(\?\>)).)*$/s', $content, $matches);

Zatím funguje dobře. uvidím jestli se časem neobjeví nějaká chyba
Jan Tvrdík
Profil
sniclman:
Já pořád nechápu, o co se vlastně snažíš.
sniclman
Profil
Jan Tvrdík:
Nejde pouze o sloučení souborů. Soubory se budou ještě pomocí dalších skriptů upravovat (např: úpravy šablonových proměnných).
Jan Tvrdík
Profil
sniclman:
Takže programuješ vlastní šablonovací systém?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: