службы отчетов — SSRS SDK для PHP: не работает с PHP 5.5

Я использую SSRS SDK для PHP который не обновлялся с годами на удивление (08.04.2010).
Он отлично работает под PHP 5.4 (5.4.44), но не под 5.5+ (5.5.37, 5.6.28, 7.x)

Ошибка:

array () Не удалось подключиться к службе отчетов. Убедитесь, что URL
(https: // MyHost: 60004 / ReportServer /) и учетные данные
правильный!

Исключение выдается в строке 207, потому что содержимое var $ равно FALSE (поэтому не может загрузить содержимое).

Это прекрасно с PHP 5.4.44.

Я не могу найти документацию «SSRS SDK For PHP» относительно поддерживаемой версии PHP …

Я не использую никакой фреймворк, такой как Symfony2, CakePHP, Zend Framework, … кроме Bootstrap.

Кто-нибудь знает или разобрался в этой проблеме?

РЕДАКТИРОВАТЬ

Как спрашивается в комментарии, вот мой код:

function buildSSRSReport($companyId)
{
require_once '../tools/SSRSReport/SSRSReport.php';

try {
// Create a connection to the SSRS Server
$rs = new SSRSReport(new Credentials(SSRS_USER_ID, SSRS_PASSWORD), SSRS_REPORT_SERVER_URL);
$sqlConnection = self::getSqlConnection();

// Load the report and specify the params required for its execution
$executionInfo = $rs->LoadReport2(self::getSSRSEnvironment(), NULL);
$parameters = array();
$parameters[0] = new ParameterValue();
$parameters[0]->Name = "CompanyId";
$parameters[0]->Value = $companyId;
$rs->SetExecutionParameters2($parameters);

// Require the Report to be rendered in HTML format
$renderAsHTML = new RenderAsPDF();

// Set the links in the reports to point to the php app
//$renderAsHTML->ReplacementRoot = getPageURL();

// Set the root path on the server for any image included in the report
//$renderAsHTML->StreamRoot = './images/';

// Execute the Report
$result_html = $rs->Render2($renderAsHTML,
PageCountModeEnum::$Actual,
$Extension,
$MimeType,
$Encoding,
$Warnings,
$StreamIds);

$pdfFileName = self::getCompanyAlias($sqlConnection, $companyId) . ".pdf";

header('Content-Type: application/x-download');
header('Content-Disposition: attachment; filename="' . $pdfFileName . '"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');

return $result_html;
} catch (SSRSReportException $serviceException) {
echo $serviceException->GetErrorMessage();
}

}

function getSSRSEnvironment()
{
return "/DEV/CompanyESGReportingServices-DEV/Main";
}

private function getSqlConnection()
{
require_once("../inc/eth_connexion.php");
/* These 4 variables are contained within the eth_connexion.php file */
$serverName = SQL_SERVERNAME;
$userName = SQL_USERNAME;
$dbName = SQL_DATABASENAME;
$password = SQL_PASSWORD;

// SQLSRV : Connection array used when calling SQL via sqlsrv_query
$connectionInfo = array("Database"=> SQL_DATABASENAME,
"UID"=> SQL_USERNAME,
"PWD"=> SQL_PASSWORD,
"ReturnDatesAsStrings" => true);

$sqlConnection = sqlsrv_connect($serverName, $connectionInfo);
if (!$sqlConnection) {
die('Can't log to the database');
}

return $sqlConnection;
}

А вот исходный код конструктора SSRSReport (оригинал из SSRS SDK для PHP):

public function SSRSReport($credentials, $url, $proxy = null)
{
$this->_BaseUrl = ($url[strlen($url) - 1] == '/')? $url : $url . '/';
$executionServiceUrl = $this->_BaseUrl . self::ExecutionService;
$managementServiceUrl = $this->_BaseUrl . self::ManagementService;

$options = $credentials->getCredentails();
$stream_conext_params = array( 'http' =>
array('header' =>
array($credentials->getBase64Auth())));
if(isset($proxy))
{
$options = array_merge($options, $proxy->getProxy());
$stream_conext_params['http']['proxy'] = 'tcp://' .
$proxy->getHost() .
':' .
$proxy->getPort();
if($proxy->getLogin() != null)
{
$stream_conext_params['http']['header'][1] = $proxy->getBase64Auth();
}
}

/**
* If the SoapClient call fails, we cannot catch exception or supress warning
* since it throws php fatal exception.
* http://bugs.php.net/bug.php?id=34657
* So try to load the wsdl by
* calling file_get_contents (with warning supressed i.e. using @ symbol
* infront of the function call)
* http://stackoverflow.com/questions/272361/how-can-i-handle-the-warning-of-filegetcontents-function-in-php
*/
$context = stream_context_create($stream_conext_params);
$content = @file_get_contents($executionServiceUrl, false, $context);
if ($content === FALSE) // I'M GOING HERE WITH PHP 5.5+
{
throw new SSRSReportException("",
"Failed to connect to Reporting Service  <br/> Make sure " .
"that the url ($this->_BaseUrl) and credentials are correct!");
}

$this->_soapHandle_Exe =  new SoapClient ($executionServiceUrl, $options);
$this->_soapHandle_Mgt =  new SoapClient ($managementServiceUrl, $options);
$this->ClearRequest();
}

Точное сообщение об ошибке:

https: // myPublicHostProvider: 60004 / ReportServer / ReportExecution2005.asmx WSDL
Авторизация: Basic = array (1) {
[«http»] => array (1) {[«header»] => array (1) {[0] => string (57)
«Authorization: Basic =»}}}
Не удалось подключиться к службе отчетов
Убедитесь, что URL (https: // myPublicHostProvider: 60004 / ReportServer /) и учетные данные верны!

0

Решение

SSRS SDK для указателей конфигурации PHP

  • Убедитесь, что ваш экземпляр сервера отчетов доступен. Проверьте это, перейдя на веб-портал или URL-адрес службы.

  • Укажите свои учетные данные. Если вы прошли аутентификацию, то учетные данные, которые вы использовали, действительны.

  • После этого перейдите в каталог \Program Files\Microsoft SQL Server\<INSTANCE_NAME>\Reporting Services\ReportServer и найдите файл с именем rsreportserver.config

  • Найти этот фрагмент

    <Authentication>
    <AuthenticationTypes>
    <RSWindowsNTLM/>
    </AuthenticationTypes>
    <Authentication>
    
  • добавлять <RSWindowsBasic/> ниже <RSWindowsNTLM/> запись.

Для справки: это был фрагмент, который я использовал для проверки своего экземпляра во время настройки.

require_once( 'SSRSReport\bin\SSRSReport.php' );

define( 'UID', 'DOMAIN\Username' );
define( 'PASWD', 'Password' );
define( 'SERVICE_URL', 'http://127.0.0.1/SERVICE_URL/' );

try {
$ssrs_report = new SSRSReport( new Credentials( UID, PASWD ), SERVICE_URL );
$ssrs_report->LoadReport2( '/test', NULL );
$renderAsHTML = new RenderAsHTML();
$result_html = $ssrs_report->Render2(
$renderAsHTML,
PageCountModeEnum::$Estimate,
$Extension,
$MimeType,
$Encoding,
$Warnings,
$StreamIds
);
echo $result_html;
} catch ( SSRSReportException $serviceException ) {
echo $serviceException->GetErrorMessage();
}

Он может успешно загрузить RDL, который находится на пути загрузки.

0

Другие решения

Спасибо за вашу помощь MiSAKACHi. Это указало мне в правильном направлении. На самом деле, я использую удаленный выделенный сервер на хостинг-провайдере, к которому у меня нет доступа. Но <RSWindowsBasic/> есть, так как он может загрузить отчет с помощью PHP 5.4. Все хорошо под этой версией.

Благодаря вам я нашел проблему: я использую HTTPS и с HTTPS он не работает, тогда как он работает, когда я использую HTTP!
Я уточняю у своего хостинг-провайдера, могут ли они что-то сделать.

РЕДАКТИРОВАТЬ — Решение

Мой хостинг-провайдер исправил проблему в прошлом году (забыл опубликовать ее здесь). В то время, когда это не было исправлено, я все еще был под PHP 5.4.
Я вставляю их оригинальное сообщение:

Эти проблемы вы описываете, потому что установленный сертификат является самозаверяющим сертификатом. Новые веб-браузеры и версия PHP не принимают эти сертификаты из-за угроз безопасности.

Мы поменяли Сертификат на официальный выданный Сертификат

0

Я просто хочу добавить, что я столкнулся с проблемой, используя Codeplex ssrsphp, поэтому я погуглил и нашел другой sdk, который отлично работает. Я использую PHP 7+. Вот это ссылка, и я доступен, если есть какие-либо вопросы, связанные с этим.

0
По вопросам рекламы [email protected]