Skip to content
Extraits de code Groupes Projets
Valider 3a3978f4 rédigé par Matthieu Napoli's avatar Matthieu Napoli
Parcourir les fichiers

ref #7235 Refactored the system check to allow plugins to add diagnostics

parent 3d3180ea
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Affichage de
avec 926 ajouts et 4 suppressions
...@@ -720,6 +720,7 @@ password = ; Proxy password: optional; if specified, username is mandatory ...@@ -720,6 +720,7 @@ password = ; Proxy password: optional; if specified, username is mandatory
Plugins[] = CorePluginsAdmin Plugins[] = CorePluginsAdmin
Plugins[] = CoreAdminHome Plugins[] = CoreAdminHome
Plugins[] = CoreHome Plugins[] = CoreHome
Plugins[] = Diagnostics
Plugins[] = CoreVisualizations Plugins[] = CoreVisualizations
Plugins[] = Proxy Plugins[] = Proxy
Plugins[] = API Plugins[] = API
......
...@@ -9,7 +9,6 @@ namespace Piwik\CliMulti; ...@@ -9,7 +9,6 @@ namespace Piwik\CliMulti;
use Piwik\CliMulti; use Piwik\CliMulti;
use Piwik\Common; use Piwik\Common;
use Piwik\Plugins\Installation\SystemCheck;
class CliPhp class CliPhp
{ {
...@@ -67,8 +66,9 @@ class CliPhp ...@@ -67,8 +66,9 @@ class CliPhp
private function isValidPhpVersion($bin) private function isValidPhpVersion($bin)
{ {
global $piwik_minimumPHPVersion;
$cliVersion = $this->getPhpVersion($bin); $cliVersion = $this->getPhpVersion($bin);
$isCliVersionValid = SystemCheck::isPhpVersionValid($cliVersion); $isCliVersionValid = version_compare($piwik_minimumPHPVersion, $cliVersion) <= 0;
return $isCliVersionValid; return $isCliVersionValid;
} }
......
...@@ -22,7 +22,7 @@ class Http ...@@ -22,7 +22,7 @@ class Http
/** /**
* Returns the "best" available transport method for {@link sendHttpRequest()} calls. * Returns the "best" available transport method for {@link sendHttpRequest()} calls.
* *
* @return string Either `'curl'`, `'fopen'` or `'socket'`. * @return string|null Either curl, fopen, socket or null if no method is supported.
* @api * @api
*/ */
public static function getTransportMethod() public static function getTransportMethod()
......
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Updates;
use Piwik\Config;
use Piwik\Updates;
class Updates_2_13_0_b3 extends Updates
{
public function doUpdate()
{
$pluginManager = \Piwik\Plugin\Manager::getInstance();
try {
$pluginManager->activatePlugin('Diagnostics');
} catch(\Exception $e) {
}
}
}
...@@ -20,7 +20,7 @@ final class Version ...@@ -20,7 +20,7 @@ final class Version
* The current Piwik version. * The current Piwik version.
* @var string * @var string
*/ */
const VERSION = '2.13.0-b2'; const VERSION = '2.13.0-b3';
public function isStableVersion($version) public function isStableVersion($version)
{ {
......
<?php
namespace Piwik\Plugins\CoreUpdater\Diagnostic;
use Piwik\Config;
use Piwik\Plugins\CoreUpdater;
use Piwik\Plugins\Diagnostics\Diagnostic\Diagnostic;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
use Piwik\Translation\Translator;
/**
* Check the HTTPS update.
*/
class HttpsUpdateCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$label = $this->translator->translate('Installation_SystemCheckUpdateHttps');
if (CoreUpdater\Controller::isUpdatingOverHttps()) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK));
}
$comment = $this->translator->translate('Installation_SystemCheckUpdateHttpsNotSupported');
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
}
}
...@@ -3,4 +3,8 @@ ...@@ -3,4 +3,8 @@
return array( return array(
'Piwik\Plugins\CoreUpdater\Updater' => DI\object() 'Piwik\Plugins\CoreUpdater\Updater' => DI\object()
->constructorParameter('tmpPath', DI\get('path.tmp')), ->constructorParameter('tmpPath', DI\get('path.tmp')),
'diagnostics.optional' => DI\add(array(
DI\link('Piwik\Plugins\CoreUpdater\Diagnostic\HttpsUpdateCheck'),
)),
); );
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\Diagnostics\Commands;
use Piwik\Container\StaticContainer;
use Piwik\Plugin\ConsoleCommand;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResultItem;
use Piwik\Plugins\Diagnostics\DiagnosticService;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Run the diagnostics.
*/
class Run extends ConsoleCommand
{
/**
* @var DiagnosticService
*/
private $diagnosticService;
public function __construct()
{
// Replace this with dependency injection once available
$this->diagnosticService = StaticContainer::get('Piwik\Plugins\Diagnostics\DiagnosticService');
parent::__construct();
}
protected function configure()
{
$this->setName('diagnostics:run')
->setDescription('Run diagnostics to check that Piwik is installed and runs correctly')
->addOption('all', null, InputOption::VALUE_NONE, 'Show all diagnostics, including those that passed with success');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$showAll = $input->getOption('all');
$report = $this->diagnosticService->runDiagnostics();
foreach ($report->getAllResults() as $result) {
$items = $result->getItems();
if (! $showAll && ($result->getStatus() === DiagnosticResult::STATUS_OK)) {
continue;
}
if (count($items) === 1) {
$output->writeln($result->getLabel() . ': ' . $this->formatItem($items[0]), OutputInterface::OUTPUT_PLAIN);
continue;
}
$output->writeln($result->getLabel() . ':');
foreach ($items as $item) {
$output->writeln("\t- " . $this->formatItem($item), OutputInterface::OUTPUT_PLAIN);
}
}
if ($report->hasWarnings()) {
$output->writeln(sprintf('<comment>%d warnings detected</comment>', $report->getWarningCount()));
}
if ($report->hasErrors()) {
$output->writeln(sprintf('<error>%d errors detected</error>', $report->getErrorCount()));
return 1;
}
return 0;
}
private function formatItem(DiagnosticResultItem $item)
{
if ($item->getStatus() === DiagnosticResult::STATUS_ERROR) {
$tag = 'error';
} elseif ($item->getStatus() === DiagnosticResult::STATUS_WARNING) {
$tag = 'comment';
} else {
$tag = 'info';
}
return sprintf(
'<%s>%s %s</%s>',
$tag,
strtoupper($item->getStatus()),
preg_replace('/\<br\s*\/?\>/i', "\n", $item->getComment()),
$tag
);
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\CliMulti;
use Piwik\Config;
use Piwik\Http;
use Piwik\Translation\Translator;
use Piwik\Url;
/**
* Check if cron archiving can run through CLI.
*/
class CronArchivingCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$label = $this->translator->translate('Installation_SystemCheckCronArchiveProcess');
$comment = $this->translator->translate('Installation_SystemCheckCronArchiveProcessCLI') . ': ';
$process = new CliMulti();
if ($process->supportsAsync()) {
$comment .= $this->translator->translate('General_Ok');
} else {
$comment .= $this->translator->translate('Installation_NotSupported')
. ' ' . $this->translator->translate('Goals_Optional');
}
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, $comment));
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Db\Adapter;
use Piwik\SettingsServer;
use Piwik\Translation\Translator;
/**
* Check supported DB adapters are available.
*/
class DbAdapterCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$results = array();
$results[] = $this->checkPdo();
$results = array_merge($results, $this->checkDbAdapters());
return $results;
}
private function checkPdo()
{
$label = 'PDO ' . $this->translator->translate('Installation_Extension');
if (in_array('PDO', $this->getPhpExtensionsLoaded())) {
$status = DiagnosticResult::STATUS_OK;
} else {
$status = DiagnosticResult::STATUS_WARNING;
}
return DiagnosticResult::singleResult($label, $status);
}
private function checkDbAdapters()
{
$results = array();
$adapters = Adapter::getAdapters();
foreach ($adapters as $adapter => $port) {
$label = $adapter . ' ' . $this->translator->translate('Installation_Extension');
$results[] = DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK);
}
if (empty($adapters)) {
$label = $this->translator->translate('Installation_SystemCheckDatabaseExtensions');
$comment = $this->translator->translate('Installation_SystemCheckDatabaseHelp');
$result = DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_ERROR, $comment);
$result->setLongErrorMessage($this->getLongErrorMessage());
$results[] = $result;
}
return $results;
}
private function getPhpExtensionsLoaded()
{
return @get_loaded_extensions();
}
private function getLongErrorMessage()
{
$message = '<p>';
if (SettingsServer::isWindows()) {
$message .= $this->translator->translate(
'Installation_SystemCheckWinPdoAndMysqliHelp',
array('<br /><br /><code>extension=php_mysqli.dll</code><br /><code>extension=php_pdo.dll</code><br /><code>extension=php_pdo_mysql.dll</code><br />')
);
} else {
$message .= $this->translator->translate(
'Installation_SystemCheckPdoAndMysqliHelp',
array(
'<br /><br /><code>--with-mysqli</code><br /><code>--with-pdo-mysql</code><br /><br />',
'<br /><br /><code>extension=mysqli.so</code><br /><code>extension=pdo.so</code><br /><code>extension=pdo_mysql.so</code><br />'
)
);
}
$message .= $this->translator->translate('Installation_RestartWebServer') . '<br/><br/>';
$message .= $this->translator->translate('Installation_SystemCheckPhpPdoAndMysqli', array(
'<a style="color:red" href="http://php.net/pdo">',
'</a>',
'<a style="color:red" href="http://php.net/mysqli">',
'</a>',
));
$message .= '</p>';
return $message;
}
}
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\Diagnostics\Diagnostic;
/**
* Performs a diagnostic on the system or Piwik.
*
* Example:
*
* class MyDiagnostic implements Diagnostic
* {
* public function execute()
* {
* $results = array();
*
* // First check (error)
* $status = testSomethingIsOk() ? DiagnosticResult::STATUS_OK : DiagnosticResult::STATUS_ERROR;
* $results[] = DiagnosticResult::singleResult('First check', $status);
*
* // Second check (warning)
* $status = testSomethingElseIsOk() ? DiagnosticResult::STATUS_OK : DiagnosticResult::STATUS_WARNING;
* $results[] = DiagnosticResult::singleResult('Second check', $status);
*
* return $results;
* }
* }
*
* Diagnostics are loaded with dependency injection support.
*
* @api
*/
interface Diagnostic
{
/**
* @return DiagnosticResult[]
*/
public function execute();
}
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\Diagnostics\Diagnostic;
/**
* The result of a diagnostic.
*
* @api
*/
class DiagnosticResult
{
const STATUS_ERROR = 'error';
const STATUS_WARNING = 'warning';
const STATUS_OK = 'ok';
/**
* @var string
*/
private $label;
/**
* @var string
*/
private $longErrorMessage = '';
/**
* @var DiagnosticResultItem[]
*/
private $items = array();
public function __construct($label)
{
$this->label = $label;
}
/**
* @param string $label
* @param string $status
* @param string $comment
* @return DiagnosticResult
*/
public static function singleResult($label, $status, $comment = '')
{
$result = new self($label);
$result->addItem(new DiagnosticResultItem($status, $comment));
return $result;
}
/**
* @return string
*/
public function getLabel()
{
return $this->label;
}
/**
* @return DiagnosticResultItem[]
*/
public function getItems()
{
return $this->items;
}
public function addItem(DiagnosticResultItem $item)
{
$this->items[] = $item;
}
/**
* @param DiagnosticResultItem[] $items
*/
public function setItems(array $items)
{
$this->items = $items;
}
/**
* @return string
*/
public function getLongErrorMessage()
{
return $this->longErrorMessage;
}
/**
* @param string $longErrorMessage
*/
public function setLongErrorMessage($longErrorMessage)
{
$this->longErrorMessage = $longErrorMessage;
}
/**
* Returns the worst status of the items.
*
* @return string One of the `STATUS_*` constants.
*/
public function getStatus()
{
$status = self::STATUS_OK;
foreach ($this->getItems() as $item) {
if ($item->getStatus() === self::STATUS_ERROR) {
return self::STATUS_ERROR;
}
if ($item->getStatus() === self::STATUS_WARNING) {
$status = self::STATUS_WARNING;
}
}
return $status;
}
}
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\Diagnostics\Diagnostic;
/**
* @api
*/
class DiagnosticResultItem
{
/**
* @var string
*/
private $status;
/**
* Optional comment about the item.
*
* @var string
*/
private $comment;
public function __construct($status, $comment = '')
{
$this->status = $status;
$this->comment = $comment;
}
/**
* @return string
*/
public function getStatus()
{
return $this->status;
}
/**
* @return string
*/
public function getComment()
{
return $this->comment;
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Filechecks;
use Piwik\Translation\Translator;
/**
* Check the files integrity.
*/
class FileIntegrityCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$label = $this->translator->translate('Installation_SystemCheckFileIntegrity');
$messages = Filechecks::getFileIntegrityInformation();
$ok = array_shift($messages);
if (empty($messages)) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK));
}
if ($ok) {
$status = DiagnosticResult::STATUS_WARNING;
return array(DiagnosticResult::singleResult($label, $status, $messages[0]));
}
$comment = $this->translator->translate('General_FileIntegrityWarningExplanation');
// Keep only the 20 first lines else it becomes unmanageable
if (count($messages) > 20) {
$messages = array_slice($messages, 0, 20);
$messages[] = '...';
}
$comment .= '<br/><br/><pre style="overflow-x: scroll;max-width: 600px;">'
. implode("\n", $messages) . '</pre>';
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_ERROR, $comment));
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Config;
use Piwik\SettingsServer;
use Piwik\Translation\Translator;
/**
* Check that the GD extension is installed and the correct version.
*/
class GdExtensionCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$label = $this->translator->translate('Installation_SystemCheckGDFreeType');
if (SettingsServer::isGdExtensionEnabled()) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK));
}
$comment = sprintf(
'%s<br />%s',
$this->translator->translate('Installation_SystemCheckGDFreeType'),
$this->translator->translate('Installation_SystemCheckGDHelp')
);
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Config;
use Piwik\Filechecks;
use Piwik\Http;
use Piwik\Translation\Translator;
/**
* Check that Piwik's HTTP client can work correctly.
*/
class HttpClientCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$label = $this->translator->translate('Installation_SystemCheckOpenURL');
$httpMethod = Http::getTransportMethod();
if ($httpMethod) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, $httpMethod));
}
$canAutoUpdate = Filechecks::canAutoUpdate();
$comment = $this->translator->translate('Installation_SystemCheckOpenURLHelp');
if (! $canAutoUpdate) {
$comment .= '<br/>' . $this->translator->translate('Installation_SystemCheckAutoUpdateHelp');
}
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Common;
use Piwik\Config;
use Piwik\Db;
use Piwik\Translation\Translator;
/**
* Check if Piwik can use LOAD DATA INFILE.
*/
class LoadDataInfileCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$isPiwikInstalling = !Config::getInstance()->existsLocalConfig();
if ($isPiwikInstalling) {
// Skip the diagnostic if Piwik is being installed
return array();
}
$label = $this->translator->translate('Installation_DatabaseAbilities');
$optionTable = Common::prefixTable('option');
$testOptionNames = array('test_system_check1', 'test_system_check2');
$loadDataInfile = false;
$errorMessage = null;
try {
$loadDataInfile = Db\BatchInsert::tableInsertBatch(
$optionTable,
array('option_name', 'option_value'),
array(
array($testOptionNames[0], '1'),
array($testOptionNames[1], '2'),
),
$throwException = true
);
} catch (\Exception $ex) {
$errorMessage = str_replace("\n", "<br/>", $ex->getMessage());
}
// delete the temporary rows that were created
Db::exec("DELETE FROM `$optionTable` WHERE option_name IN ('" . implode("','", $testOptionNames) . "')");
if ($loadDataInfile) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, 'LOAD DATA INFILE'));
}
$comment = sprintf(
'LOAD DATA INFILE<br/>%s<br/>%s',
$this->translator->translate('Installation_LoadDataInfileUnavailableHelp', array(
'LOAD DATA INFILE',
'FILE',
)),
$this->translator->translate('Installation_LoadDataInfileRecommended')
);
if ($errorMessage) {
$comment .= sprintf(
'<br/><strong>%s:</strong> %s<br/>%s',
$this->translator->translate('General_Error'),
$errorMessage,
'Troubleshooting: <a target="_blank" href="?module=Proxy&action=redirect&url=http://piwik.org/faq/troubleshooting/%23faq_194">FAQ on piwik.org</a>'
);
}
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Config;
use Piwik\SettingsServer;
use Piwik\Translation\Translator;
/**
* Check that the memory limit is enough.
*/
class MemoryLimitCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
/**
* @var int
*/
private $minimumMemoryLimit;
public function __construct(Translator $translator, $minimumMemoryLimit)
{
$this->translator = $translator;
$this->minimumMemoryLimit = $minimumMemoryLimit;
}
public function execute()
{
$label = $this->translator->translate('Installation_SystemCheckMemoryLimit');
SettingsServer::raiseMemoryLimitIfNecessary();
$memoryLimit = SettingsServer::getMemoryLimitValue();
$comment = $memoryLimit . 'M';
if ($memoryLimit >= $this->minimumMemoryLimit) {
$status = DiagnosticResult::STATUS_OK;
} else {
$status = DiagnosticResult::STATUS_WARNING;
$comment .= sprintf(
'<br />%s<br />%s',
$this->translator->translate('Installation_SystemCheckMemoryLimitHelp'),
$this->translator->translate('Installation_RestartWebServer')
);
}
return array(DiagnosticResult::singleResult($label, $status, $comment));
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Config;
use Piwik\Filesystem;
use Piwik\Translation\Translator;
/**
* Checks if the filesystem Piwik stores sessions in is NFS or not.
*
* This check is done in order to avoid using file based sessions on NFS system,
* since on such a filesystem file locking can make file based sessions incredibly slow.
*/
class NfsDiskCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function execute()
{
$label = $this->translator->translate('Installation_Filesystem');
if (! Filesystem::checkIfFileSystemIsNFS()) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK));
}
$isPiwikInstalling = !Config::getInstance()->existsLocalConfig();
if ($isPiwikInstalling) {
$help = 'Installation_NfsFilesystemWarningSuffixInstall';
} else {
$help = 'Installation_NfsFilesystemWarningSuffixAdmin';
}
$comment = sprintf(
'%s<br />%s',
$this->translator->translate('Installation_NfsFilesystemWarning'),
$this->translator->translate($help)
);
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
}
}
<?php
namespace Piwik\Plugins\Diagnostics\Diagnostic;
use Piwik\Config;
use Piwik\Http;
use Piwik\Translation\Translator;
use Piwik\Url;
use Psr\Log\LoggerInterface;
/**
* Check that mod_pagespeed is not enabled.
*/
class PageSpeedCheck implements Diagnostic
{
/**
* @var Translator
*/
private $translator;
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(Translator $translator, LoggerInterface $logger)
{
$this->translator = $translator;
$this->logger = $logger;
}
public function execute()
{
$label = $this->translator->translate('Installation_SystemCheckPageSpeedDisabled');
if (! $this->isPageSpeedEnabled()) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK));
}
$comment = $this->translator->translate('Installation_SystemCheckPageSpeedWarn', array(
'(eg. Apache, Nginx or IIS)',
));
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
}
private function isPageSpeedEnabled()
{
$url = Url::getCurrentUrlWithoutQueryString() . '?module=Installation&action=getEmptyPageForSystemCheck';
try {
$page = Http::sendHttpRequest($url,
$timeout = 1,
$userAgent = null,
$destinationPath = null,
$followDepth = 0,
$acceptLanguage = false,
$byteRange = false,
// Return headers
$getExtendedInfo = true
);
} catch(\Exception $e) {
$this->logger->info('Unable to test if mod_pagespeed is enabled: the request to {url} failed', array(
'url' => $url,
));
// If the test failed, we assume Page speed is not enabled
return false;
}
$headers = $page['headers'];
return isset($headers['X-Mod-Pagespeed']) || isset($headers['X-Page-Speed']);
}
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter