Вопрос

У нас есть клиент, который пытается вызвать наш веб-сервис, написанный на C#, из кода PHP.Вызов веб-службы принимает длинный параметр.

Этот вызов работает нормально для других клиентов, звонящих с C# или Java, но этот клиент получает ответную ошибку в результате вызова.Я не отлаживал их конкретный вызов, но предполагаю, что 64-битное целое число каким-то образом усекается из PHP.Клиент говорит, что он просто вызывает веб-сервис со строкой, но есть ли в PHP оболочка, которая выполняет преобразование типов.Может ли это быть потеря информации о номере?

Спасибо за любую информацию.

Это было полезно?

Решение

Большинство установок PHP не поддерживают 64-битные целые числа — максимум 32.Вы можете проверить это, прочитав константу PHP_INT_SIZE (4 = 32 бита, 8 = 64 бита) или прочитав значение PHP_INT_MAX.

<?php

echo PHP_INT_SIZE, "\n", PHP_INT_MAX;

?>

Если класс веб-сервиса, который он использует, пытается преобразовать строковое представление 64-битного целого числа, то да, скорее всего, оно усекается или преобразуется в число с плавающей запятой.Вы можете увидеть это поведение с помощью этого простого теста.

<?php

echo intval( "12345678901234567890" );
// prints 2147483647, the max value for a 32 bit signed int.

Не зная деталей его реализации, трудно предположить, каким может быть хорошее решение/обходной путь.

Другие советы

Если вам абсолютно необходимо взять такое большое число, сделайте его строкой и преобразуйте в long в своем веб-сервисе.

Это немного побеспокоит других ваших пользователей, но сделает его более дружелюбным для клиентов, использующих PHP.

PHP жестоко уничтожил поддержку целых чисел до такой степени, что у вас нет предсказуемого способа узнать, будет ли конкретная установка обрабатывать 32-битные или 64-битные целые числа.

Самый простой способ справиться с этим — предоставить новую конечную точку, которая принимает строку, и просто передать ее на свою сторону.

Для справки об эпическом провале PHP:

http://www.mysql Performanceblog.com/2007/03/27/integers-in-php-running-with-scissors-and-portability/

Я написал статью о PHP, использующем nuSoap для вызова веб-службы C#...Я еще не сталкивался с проблемой преобразования длинных целых чисел, но я обязательно проведу несколько тестов, чтобы понять, стоит ли добавлять ее в свою статью.Спасибо, Шонhttp://seanmcilvenna.com/blog/7-general/24-windows-php-development

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top