/** * PingBackを送信 */ protected function sendPingBack() { $err = array(); $links = array(); // Wikiのソースのアドレスを取得 if (preg_match_all('/(https?://[a-zA-Z0-9./~_]+)/', $wiki->get(), $links, PREG_PATTERN_ORDER) === false) { // ない場合そのままリターン return; } // 重複を削除 $target_uris = array_unique($links[0]); foreach ($target_uris as $target_uri) { // 初期値 $pingback = false; // ターゲットとなるURL接続 $client = new Client($target_uri); // HEADメソッドで接続し、ヘッダーのみ取得 $client->setMethod(Request::METHOD_HEAD); // 返り値を取得 $response = $client->send(); // アクセス失敗 if (!$response->isSuccess()) { continue; } // 返り値のヘッダーからPingBackのURIを取得 $pingback = $response->getHeaders()->get('x-pingback'); // x-pingbackヘッダーがない場合(このへんの処理は重そう) if ($pingback === false) { try { // GETでアクセスしてコンテンツを取得し、linkタグを探す。 $client->setMethod(Request::METHOD_GET); // 返り値を取得 $response = $client->send(); // linkタグからPingBackのURIを取得 if (preg_match('<link rel="pingback" href="([^"]+)" ?/?>', $response->getBody(), $matches) !== false) { $pingback = isset($matches[1]) ? $matches[1] : null; } } catch (Exception $e) { $err[] = $e; } } // PingBack送信先が見つからない場合スキップ if ($pingback === false) { continue; } unset($client, $response); // PingBackで送信する内容 $request = new XmlRpcRequest(); $request->setMethod('pingback.ping'); $request->setParams(array($source_uri, $target_uri)); // 例外を取得 try { // PingBack送信先に接続 $client = new XmlRpcClient($pingback); // 送信 $client->doRequest($request); } catch (\Zend\XmlRpc\Client\Exception\FaultException $e) { $err[] = $e; } $err[] = '-----' . "\n"; unset($client, $request); } return $err; }