<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHP Archivy - WP Pomoc</title>
	<atom:link href="https://wp-pomoc.cz/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://wp-pomoc.cz/category/php/</link>
	<description>Zrychlujeme, opravujeme a vylepšujeme weby. WordPress pomoc s bleskovou rychlostí.</description>
	<lastBuildDate>Mon, 12 Feb 2024 17:02:50 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://wp-pomoc.cz/wp-content/uploads/2023/07/icon-blue-150x150.png</url>
	<title>PHP Archivy - WP Pomoc</title>
	<link>https://wp-pomoc.cz/category/php/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PHP funkce set_time_limit a její problémy u hostingů</title>
		<link>https://wp-pomoc.cz/php-funkce-set_time_limit-a-jeji-problemy-u-hostingu/</link>
		
		<dc:creator><![CDATA[wp-pomoc]]></dc:creator>
		<pubDate>Mon, 12 Feb 2024 16:59:28 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://wp-pomoc.cz/?p=15212</guid>

					<description><![CDATA[<p>Valná většina uživatelů systému WordPress ani neví, že nějaká taková funkce existuje. Není divu, ona se totiž až do verze PHP 8 chovala velice nenápadně, ale využívána je opravdu často. Upravuje totiž dobu, po kterou se může vykonávat PHP skript. V nastavení PHP existuje možnost zakázat volání nějaké funkce z bezpečnostních, nebo i jiných důvodů [&#8230;]</p>
<p>Článek <a href="https://wp-pomoc.cz/php-funkce-set_time_limit-a-jeji-problemy-u-hostingu/">PHP funkce set_time_limit a její problémy u hostingů</a> se nejdříve objevil na <a href="https://wp-pomoc.cz">WP Pomoc</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Valná většina uživatelů systému <a href="https://wordpress.org" target="_blank" rel="noreferrer noopener">WordPress</a> ani neví, že nějaká taková funkce existuje. Není divu, ona se totiž až do verze PHP 8 chovala velice nenápadně, ale využívána je opravdu často. Upravuje totiž dobu, po kterou se může vykonávat PHP skript.</p>



<p class="wp-block-paragraph">V nastavení PHP existuje možnost zakázat volání nějaké funkce z bezpečnostních, nebo i jiných důvodů s pomocí direktivy <em>disable_functions</em>. Po tomto nastavení často šahají sdílené webhostingy, protože například v případě funkce <em>set_time_limit</em> by mohlo dojít k většímu vytěžování zdrojů serveru na úkor ostatních webů na daném webhostingu. </p>



<p class="wp-block-paragraph">Pokud jsme v případě PHP 7 a starších verzí zavolali zakázanou funkci, dostali jsme warning s následující hláškou.  </p>



<pre class="wp-block-code"><code>Warning: set_time_limit() has been disabled for security reasons in ... on line ...</code></pre>



<p class="wp-block-paragraph">Protože se jedná pouze o warning, bylo možné tuto hlášku potlačit pomocí zavináče (@) a pokračovat dál, jako by se nic nestalo. Lze proto ve starších verzích WordPressu, Joomly a různých pluginů narazit na následující volání.</p>



<pre class="wp-block-code"><code>@set_time_limit(0);</code></pre>



<p class="wp-block-paragraph">Tento (značně lenivý) přístup pak změnil příchod PHP 8, kdy byl tento vcelku neškodný warning povýšen na error a začaly se dít věci. Tato funkce je totiž často užívána v případech, kdy dochází k nějakému AJAXovému volání. Uživatel často ani nepozná problém. Jedinou indicií je většinou pouze načítací obrazovka, která nikdy nezmizí.</p>



<pre class="wp-block-code"><code>Fatal error: Uncaught Error: Call to undefined function set_time_limit() in ...:...</code></pre>



<p class="wp-block-paragraph">Pro populární systémy přišlo řešení vcelku rychle. Můžeme se totiž dotázat, jestli funkce existuje a až poté ji v případě splnění podmínky zavolat. Jednoduché že? Problém je v tom, že ačkoliv jádra těchto systémů aktualizaci s následujícím kódem obdržela, valná většina pluginů a komunitního kódu již ne.</p>



<pre class="wp-block-code"><code>if (!function_exists('set_time_limit')) {
    set_time_limit(0);
}</code></pre>



<p class="wp-block-paragraph">Najednou se tedy dostáváme do stavu, kdy část systémů funguje s pomocí výše popsaného opraveného kódu a část padá, protože obsahuje již zastaralý workaround. Jako řešení se tedy nabízí polyfill této metody a to nám i nová verze PHP 8 dovoluje! V minulých verzích to možné nebylo, protože na zakázanou funkci nebylo nahlíženo stejně jako na neexistující. Sama <a href="https://www.php.net/manual/en/migration80.incompatible.php" target="_blank" rel="noreferrer noopener">dokumentace PHP</a> zmiňuje tuto změnu následovně: <em>„Disabled functions are now treated exactly like non-existent functions. Calling a disabled function will report it as unknown, and redefining a disabled function is now possible.“</em>.</p>



<pre class="wp-block-code"><code>// Jednoduchý polyfill pro PHP 8
if (!function_exists('set_time_limit')) {
    function set_time_limit($sec) {
        return false; // Vracíme informaci o tom, že volání selhalo.
    }
}</code></pre>



<p class="wp-block-paragraph">A fungovat nám to najednou bude krásně! Ale jen pro PHP 8. Pokud tento kód zkusíme spustit ve starších verzích PHP, selže. Příčinou je právě výskyt zakázané funkce v seznamu definovaných funkcí a výsledkem je tak chyba s informací, že nemůžeme funkci deklarovat vícekrát.</p>



<pre class="wp-block-code"><code>Fatal error: Cannot redeclare set_time_limit() in ... on line ...</code></pre>



<p class="wp-block-paragraph">Protože nám <em>function_exists</em> pro vypnutou funkci napříč verzemi PHP vrátí false, musíme nějak toto volání omezit na PHP verze 8. S pomocí <em>PHP_VERSION</em> a <em>version_compare()</em> je to vcelku triviální. Výsledný kód, který bude problém řešit napříč verzemi by mohl vypadat následovně:</p>



<pre class="wp-block-code"><code>if (!function_exists('set_time_limit') && version_compare(PHP_VERSION, '8.0.0', '>=')) {
    function set_time_limit($sec) {
        return false; // Vracíme informaci o tom, že volání selhalo.
    }
}</code></pre>



<p class="wp-block-paragraph">V případě WordPressu pak můžeme tuto funkci vložit např. do souboru wp-config.php a tím vyřešit problém s voláním zakázené funkce, který by nám mohl shazovat nejčastěji cron a AJAX volání.</p>



<h2 class="wp-block-heading">Potřebujete pomoc?</h2>



<p class="wp-block-paragraph">Neváhejte a napište nám! Web s vámi nainstalujeme, nastavíme a zabezpečíme. Vy se nemusíte o nic starat. Stačí vyplnit náš <a href="https://wp-pomoc.cz/kontakt/">kontaktní formulář</a> nebo se nám ozvat na <a href="https://wp-pomoc.cz/jak-zacit-s-wordpressem-pruvodce-pro-zacatecniky/info@wp-pomoc.cz">info@wp-pomoc.cz</a>.</p>
<p>Článek <a href="https://wp-pomoc.cz/php-funkce-set_time_limit-a-jeji-problemy-u-hostingu/">PHP funkce set_time_limit a její problémy u hostingů</a> se nejdříve objevil na <a href="https://wp-pomoc.cz">WP Pomoc</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
