Вызов веб-службы C # из PHP с длинным параметром - PullRequest
1 голос
/ 14 октября 2008

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

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

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

Ответы [ 4 ]

1 голос
/ 15 октября 2008

Большинство установок 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.

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

0 голосов
/ 01 октября 2009

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

0 голосов
/ 15 октября 2008

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

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

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

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

0 голосов
/ 15 октября 2008

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

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

...