0

Я использую простой скрипт php для отправки push-уведомления с моего сервера на мой iPhone (см. Ниже). Я уже импортировал сертификаты. Если я открою/, выполните этот php-файл с браузером мой iPhone получает уведомление, и я получаю положительный ответ от APNS.APNS не работает с командной строкой

Теперь я пытаюсь выполнить один и тот же PHP-файл с командной строки моего сервера, используя эту инструкцию:

php -f C:/inetpub/wwwroot/pushNotification/new.php 

я получаю то же самое, положительный ответ от APNS как когда я исполню php-файл с моим браузером, но мой iPhone никогда не получаетpush-уведомление.

Кто-нибудь знает, что здесь не так?

Спасибо!

Бьорн

PHP-файл:

<?php  

      $deviceToken ='xxxxx'; 
      $passphrase = 'mypass'; 

      $message = "TEST"; 

      $ctx = stream_context_create(); 
      stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck-pub.pem'); 
      stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

      $fp = stream_socket_client(
       'ssl://gateway.push.apple.com:2195', $err, 
       $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

      if (!$fp) 
       exit("Failed to connect: $err $errstr" . PHP_EOL); 

      echo 'Connected to APNS' . PHP_EOL; 

      $body['aps'] = array(
       'alert' => $message, 
       'sound' => 'default' 
       ); 

      $payload = json_encode($body); 

      $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

      $result = fwrite($fp, $msg, strlen($msg)); 

      if (!$result) 
       echo 'Message not delivered' . PHP_EOL; 
      else 
       echo 'Message successfully delivered' . PHP_EOL; 

      fclose($fp); 

?> 

Командная строка ответа:

Connected to APNS 
Message successfully delivered 
+0

На 'cmd' вы получаете одно из этих сообщений (то есть: подключено к APNS)? – Hackerman

+0

Да. Я редактирую вопрос, чтобы вы могли видеть вывод cmd. @Hackerman – Burn

+1

Попробуйте выполнить команду внутри папки 'C:/inetpub/wwwroot/pushNotification /' и набрав 'php -f new.php' (только для тестирования) – Hackerman

ответ

1

Вы можете попробовать создать .cmd файл следующие строки (т.е. test.cmd):

cd C:\inetpub\wwwroot\pushNotification\ 
php -f news.php 

И в вашем file1.php, используйте эту строку коды вместо:

exec('test.cmd'); 

Надеется, что это помогает.

Не тестировалось: Вы можете передать аргументы по этому пути тоже:

exec('test.cmd arg1 arg2'); 

И в .cmd файле

cd C:\inetpub\wwwroot\pushNotification\ 
php -f news.php %1 %2 
+0

Хорошо, это отлично работает для меня, но теперь я столкнулся с новой проблемой. В файле1 передаю некоторые аргументы в файл new.php: 'php -f C: /inetpub/wwwroot/pushNotification/new.php.' .escapeshellarg ($ arg1). '""' .escapeshellarg ($ arg2). ' «\t \t \t \t \t»».escapeshellarg (arg3 $) Как я могу передать те в файл CMD и использовать их в этом? @Hackerman – Burn

+0

рад помочь @Burn, и рад, что вы нашли ответ – Hackerman

+0

я выиграл мой первая щедрость ... спасибо @Burn – Hackerman

0

Если вы пытаетесь выполнить php1 -file в другом php2-файле (с помощью exec()), это решение на основе подсказки Hackerman, что вам нужно изменить каталог.

Вы можете изменить директорию вашего процесса php2 с помощью:

chdir('php1_directory_path'); 

после этого вы можете выполнить ваш php1-файл, как если php2 будет работает в директории php1 путем использования:

exec('php -f php1.php') 

Этот решение имеет то преимущество, что вы все еще можете передавать аргументы в php1:

exec('php -f *php1.php* "'.escapeshellarg(arg1).'" "'.escapeshellarg(arg2))