<?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>/me &#187; cURL</title>
	<atom:link href="http://martin.schurbohm.net/wordpress/tag/curl/feed" rel="self" type="application/rss+xml" />
	<link>http://martin.schurbohm.net/wordpress</link>
	<description>Aaah - Venedig!</description>
	<lastBuildDate>Sat, 03 Dec 2011 08:42:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PHP, cURL und die SESSION</title>
		<link>http://martin.schurbohm.net/wordpress/2010/02/08/php-curl-und-die-session.html</link>
		<comments>http://martin.schurbohm.net/wordpress/2010/02/08/php-curl-und-die-session.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 00:31:57 +0000</pubDate>
		<dc:creator>MarS</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[cURL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Session]]></category>

		<guid isPermaLink="false">http://martin.schurbohm.net/wordpress/?p=339</guid>
		<description><![CDATA[Mir hat ein kleines Problem beinahe das Genick gebrochen &#8230; mehrstündige Recherchen im Netz brachten mich keinen Meter weiter, ich hoffe der Artikel hilft dem ein oder anderen bei der &#8220;Fehlersuche&#8221; &#8211; aber fangen wir von vorne an. Sessions sind eine prima Sache, wer Daten über mehrere Scripte hinaus austauschen will, der greift darauf zurück. [...]]]></description>
			<content:encoded><![CDATA[<p>Mir hat ein kleines Problem beinahe das Genick gebrochen &#8230; mehrstündige Recherchen im Netz brachten mich keinen Meter weiter, ich hoffe der Artikel hilft dem ein oder anderen bei der &#8220;Fehlersuche&#8221; &#8211; aber fangen wir von vorne an.</p>
<p>Sessions sind eine prima Sache, wer Daten über mehrere Scripte hinaus austauschen will, der greift darauf zurück.<br />
Leider passiert es nun manchmal, dass man ein eigenes Script als fertiges HTML benötigt &#8211; ein include() per HTTP fällt aber auf vielen Servern dank der allow_url_include Konfigurationseinstellung flach, also muss cURL her.<br />
Mit cURL können wir ein beliebiges Script per HTTP aufrufen und den Inhalt in der aktuellen Seite einbinden, ohne dass ein User etwas davon merkt.</p>
<p>Wer nun aber denkt, er könne die Session-Daten auch in dem Script abgreifen, das per cURL geladen wird, der wird sein blaues Wunder erleben. cURL generiert jedesmal eine neue Session-ID, anstatt die vorhandene fortzusetzen &#8211; ist ja auch klar, das ist, als ob man einen zweiten Browser startet, also übergibt man die Session-ID. Entweder kann man diese einfach als GET-Parameter anhängen, oder man setzt eine cURL-Option für ein Cookie.</p>
<p>Das sieht dann so aus:</p>
<pre name="code" class="php">
<?php
  session_start();
  // beliebiger Code
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_COOKIE, session_name() . "=" . session_id());
  curl_exec($ch);
  curl_close($ch);
?></pre>
<p>Wer jetzt das Script aufruft, wird mit einer Sanduhr belohnt. Das Script läd und läd und hört nicht auf. Ein neuer Seitenaufruf schlägt ebenfalls fehlt und wird wieder mit einer Sanduhr belohnt. Der User denkt dann sein Browser wäre abgestürzt, weil nichts mehr funktioniert.</p>
<p><strong>Warum?</strong></p>
<p>Wenn man es weiß, ich die Lösung (wie immer) ganz einfach.<br />
PHP schreibt die Session-Daten erst bei der Beendigung eines Scripts in die Datei auf dem Server. Während das Script läuft, ist die Datei gesperrt, so dass nicht mehrere Scripte gleichzeitig die Daten ändern. Wir müssen also dafür sorgen, dass die Session-Daten gespeichert werden, bevor wir das nächste Script aufrufen. Das erledigt session_write_close(); für uns.</p>
<pre name="code" class="php">
<?php
  session_start();
  // beliebiger Code
  session_write_close();
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_COOKIE, session_name() . "=" . session_id());
  curl_exec($ch);
  curl_close($ch);
?></pre>
<p>Die Daten in der Superglobalen $_SESSION stehen nach dem Schließen selbstverständlich noch (read-only) zur Verfügung.<br />
Lese- <strong>und</strong> Schreibrechte hat jetzt aber das per cURL aufgerufene Script.</p>
]]></content:encoded>
			<wfw:commentRss>http://martin.schurbohm.net/wordpress/2010/02/08/php-curl-und-die-session.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

