2014-06-13 5 views
0

J'ai récemment changé d'hébergement Web et malheureusement, l'administrateur a désactivé file_get_content et d'autres fonctions.Alternative à file_get_content (php: // entrée)

Le but de ce script est d'obtenir des informations sur l'appareil iOS directement à partir de l'appareil. Avant, j'utilisais ce code pour le faire:

$content = file_get_contents('php://input'); 
    file_put_contents("data.txt", $content); 

Et le résultat était comme ça (en data.txt)

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>IMEI</key> 
    <string>01 257233 621346 0</string> 
    <key>PRODUCT</key> 
    <string>iPhone2,1</string> 
    <key>SERIAL</key> 
    <string>5K1124GHEDG</string> 
    <key>UDID</key> 
    <string>07cc825055gftr4edsa3f06d0373376a7664a66a</string> 
    <key>VERSION</key> 
    <string>10B329</string> 
</dict> 
</plist> 

Comme la fonction Curl est activée sur mon serveur, j'ai essayé ce code de différentes façons, mais n'a pas fonctionné. Le fichier data.txt est vidé en conséquence!

$ch = curl_init(); 
    $timeout = 0; 
    curl_setopt ($ch, CURLOPT_URL, "php://input"); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
    $contents = curl_exec($ch); 
    curl_close($ch); 
    file_put_contents("data.txt", $contents); 

mise à jour:

Laissez-moi vous expliquer comment cela fonctionne. Nous dirigeons les utilisateurs vers un profil qui est stocké sur notre serveur (par exemple device.mobileconfig). Une fois que les utilisateurs cliquent dessus, ils seront invités à l'installer. Son contenu est:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>PayloadContent</key> 
    <dict> 
     <key>URL</key> 
     <string>http://mywebsite.com/get.php</string> 
     <key>DeviceAttributes</key> 
      <array> 
       <string>UDID</string> 
       <string>VERSION</string> 
       <string>PRODUCT</string> 
       <string>SERIAL</string> 
      </array> 
    </dict> 
    <key>PayloadDescription</key> 
    <string>Install to get device info</string> 
    <key>PayloadDisplayName</key> 
    <string>UDID Finder</string> 
    <key>PayloadIdentifier</key> 
    <string>com.myud.ir</string> 
    <key>PayloadOrganization</key> 
    <string>MyUD.ir</string> 
    <key>PayloadRemovalDisallowed</key> 
    <false/> 
    <key>PayloadType</key> 
    <string>Profile Service</string> 
    <key>PayloadUUID</key> 
    <string>57A223FD-F675-90B1-8F43-22D3FC3BC181</string> 
    <key>PayloadVersion</key> 
    <integer>1</integer> 
</dict> 
</plist> 

Le profil exécute get.php pour extraire des données de l'unité. J'ai essayé celui de Cristian mais je n'ai pas travaillé. J'ai probablement une erreur d'où. Le get.php est:

<?php 
    $xml = new SimpleXMLElement('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"/>'); 
    $dict = $xml->addChild('dict'); 
    foreach ($_POST as $item => $value) { 
     $dict->addChild('string', $item); 
     $dict->addChild('key', $value); 
    } 
    file_put_contents("data.txt", trim(str_replace('<?xml version="1.0"?>', '', $xml->asXML()))); 
?> 

P.S.

J'ai juste besoin les données entre

<dict></dict> 
+0

il y a aussi une option curl pour définir le fichier de destination. – Charles

+0

curl n'a aucune connaissance des flux de php. Il attend une URL correcte, et se plaindra à juste titre que 'php' n'est pas un protocole connu. –

+0

@MarcB: Donc vous voulez dire que je ne peux pas obtenir de données par la méthode Curt? – PersianHero

Répondre

0

Merci beaucoup Cristian. ça a marché.

J'ai également trouvé un autre moyen qui est PEAR php Component qui fournit beaucoup de fonctions qui sont une alternative aux principales fonctions PHP pour les personnes qui luttent comme moi!

par exemple, dans mon cas, j'uploadés la fonction file_get_content dans le même dossier et inclus que get.php

au lieu de

$content = file_get_contents('php://input'); 
file_put_contents("data.txt", $content); 

J'utilise maintenant

require_once 'file_get_contents.php'; 
$content = php_compat_file_get_contents('php://input'); 
file_put_contents("data.txt", $content); 
+0

Excellent, de rien! – Cristian

0

En supposant que php://input est un flux de lecture seule qui vous permet de lire des données brutes du corps de demande, vous pouvez résoudre ce problème en allant chercher $_POST données puis créer un document xml en utilisant la classe SimpleXMLElement php alors sera écrit à data.txt. Vous pouvez procéder ainsi:

$xml = new SimpleXMLElement('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"/>'); 
$dict = $xml->addChild('dict'); 
foreach ($_POST as $item => $value) { 
    $dict->addChild('string', $item); 
    $dict->addChild('key', $value); 
} 
file_put_contents("data.txt", trim(str_replace('<?xml version="1.0"?>', '', $xml->asXML()))); 

Une autre solution:

$f = fopen('php://input','r'); 
$out = fopen('data.txt','w'); 
$body = ""; 
while($line = fgets($f)) { 
    $body .= $line; 
} 
fwrite($out, $body); 
fclose($f); 
fclose($out); 
+0

Ne fonctionne pas. S'il vous plaît examiner mon premier message. J'ai ajouté plus d'explications – PersianHero

+0

Vous transmettez des données à votre script PHP en utilisant $ _POST? ou $ _GET? – Cristian

+0

Je ne fais rien. Une fois que l'utilisateur appuie sur "installer", iOS établit une connexion avec get.php et envoie les informations demandées que nous avons définies dans le profil (dans notre cas: UDUD, VERSION, PRODUCT, SERIAL) par la méthode $ _POST. J'ai enregistré une courte vidéo de processus pour vous. https://www.youtube.com/watch?v=qOn-sAPnMew – PersianHero