2010-06-08 3 views
4

J'ai besoin de développer une classe PHP pour communiquer avec les serveurs Apple afin de faire une notification Push (APNS). J'ai le certificat (.pem) et j'ai essayé de suivre divers tutoriels trouvés sur Internet, mais je reçois toujours une erreur en essayant de se connecter à ssl: //gateway.sandbox.push.apple.com: 2195 avec socket de flux:Comment puis-je faire une connexion SSL avec PHP?

$apnsHost = 'gateway.sandbox.push.apple.com'; 
$apnsPort = 2195; 
$apnsCert = 'apns-dev.pem'; 
$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
$apns = stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort, $error, $errorString, 2, 
STREAM_CLIENT_CONNECT, $streamContext); 

Un telnet sur cette URL fonctionne donc le port 2195 est ouvert. Openssl est activé sur PHP depuis que je reçois les "Transports enregistrés de flux de flux: tcp, udp, ssl, sslv3, sslv2, tls" avec un phpinfo(). Mon certificat est bien lu (PHP is_readable (certif.pem) renvoie true sur le fichier)

Y at-il autre chose à activer dans Apache ou PHP pour le faire fonctionner?

+0

, vous mentionnez également une erreur. Quelle est exactement l'erreur? –

+0

Y a-t-il d'autres erreurs détaillées affichées? (vérifiez votre niveau de rapport d'erreur) – baloo

+0

Comme je l'ai écrit ci-dessous, les erreurs sont les suivantes: [function.stream-socket-client]: Impossible de définir le fichier local de chaîne de cert 'editus_dev_push.pem '; [function.stream-socket-client]: impossible de créer un handle SSL [function.stream-socket-client]: Impossible d'activer crypto [function.stream-socket-client]: impossible de se connecter à ssl: // gateway. sandbox.push.apple.com:2195 (Erreur inconnue) – Anth0

Répondre

0

Trouvé! Le problème était avec le certificat. Comme je ne l'ai pas créé moi-même, je n'étais pas en train d'enquêter mais je me suis trompé ...

J'ai décidé de le régénérer correctement en suivant ces instructions: Error using ssl cert with PHP et ça marche!

Merci pour votre aide :)

0

Mon premier commentaire est que vous n'utiliserez pas apache. Pour communiquer avec APNS, vous devrez exécuter votre script PHP en tant que script shell (un démon). Vous devrez ouvrir une connexion socket avec les services Apple. Voir socket_connect()http://www.php.net/manual/en/function.socket-connect.php pour commencer. Rappelez-vous que vous devez garder la connexion ouverte, ce qui signifie que le script PHP ne doit pas quitter après une seule exécution mais maintenir une boucle quasi infinie. À chaque itération, vérifiez s'il y a des changements à faire, écrivez sur le socket, dormez, répétez.

Il y a beaucoup d'informations sur le site de développement d'Apple. Commencez ici http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1

Un petit peu de googling APNS with PHP a produit quelques résultats dont l'un est http://code.google.com/p/php-apns/ qui semble prometteur.

+0

Hum Je ne comprends pas pourquoi je devrais laisser la connexion ouverte? Que se passe-t-il si je veux juste ouvrir la connexion, envoyer une notification, puis fermer la connexion? Ou plus spécifique à mon cas, exécutez mon script PHP une fois par semaine pour envoyer des nouvelles à l'application de mon iPhone. J'ai déjà fait ce genre de recherches et j'utilise APNS PHP – Anth0

+0

Sur le lien que j'ai fourni au site Apple juste en dessous de la case -Note, il y a une ligne: "Vous devez également conserver les connexions avec les APN. connexions qui sont rapidement et à plusieurs reprises établies et démantelées comme une attaque par déni de service.Par erreur, APNs ferme la connexion sur laquelle l'erreur s'est produite. " Dans votre cas je suppose que recréer la connexion une fois par semaine n'est pas horribad mais juste être au courant. –

+0

Ok, je garde ce point en tête. C'est parce que je suis déjà en train d'utiliser le code PHP APNS et parce que je pense que tout va bien du côté PHP que je commence à penser que c'est un problème d'Apache ... – Anth0

1

Pas exactement sur le sujet, mais mérite une mention:

Deux choses sont importantes pour faire fonctionner SSL avec PHP (si vous compilez PHP à partir des sources)

1) assurez-vous que les packages openssl base et devel sont installés yum install openssl openssl-devel

2) compiler PHP avec le support openssl: c'est-à-dire utiliser l'option --with-openssl lors de l'exécution de la configuration.

Ensuite, ssl apparaîtra dans le « flux enregistrés tokens de » dans phpinfo()

Questions connexes