Bonsoir les lapins,

je cherche à automatiser la copie de fichiers provenant d’une API REST (en l’occurence, celle de Github), de la façon la plus sûre mais aussi la plus efficace qui soit.

Au niveau de la sécurité je crois que je suis bon : j’ouvre un fichier en écriture avec $fh = fopen($path, 'cb'); et je mets un mutex dessus avec flock($fh, LOCK_EX);. Par contre je veux aussi gérer les droits du fichier, et je ne sais pas exactement à quel moment appeler chmod : avant ou après flock ? Ou encore un autre moment ?

Au niveau de l’API c’est bon aussi, j’arrive à récupérer le contenu avec file_get_contents et stream_context_create. Mais j’ai un gros doute sur l’efficiacité de ma méthode : le fichier entier se retrouve dans la RAM de mon process PHP, et j’aimerais savoir s’il y a un moyen de « brancher les tuyaux » avec des streams ou je ne sais quoi pour optimiser la copie des données. Tout en conservant la possibilité de verrouiller et chmodder proprement mon fichier local. Je n’ai pas beaucoup expérimenté avec les streams encore, donc pour l’instant je ne suis pas très à l’aise avec.

Pour le moment mon script ressemble à ce qui suit (j’en ai coupé pour ne montrer que l’essentiel). Notez que j’ai opté temporairement pour file_put_contents plutôt que fopen et compagnie pour des raisons de lisibilité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
error_reporting(-1);
 
$apiEndpoint = 'https://api.github.com/repos/Watilin/hook-tests/contents/{+path}';
$path = 'bidule.txt';
 
if (file_exists($path) && !is_file($path)) {
  unlink($path);
}
 
$fileUrl = str_replace(
  '{+path}',
  str_replace('%2F', '/', rawurlencode($path)),
  $apiEndpoint
);
 
$context = stream_context_create([
  'http' => [
    'method' => 'GET',
    'header' => [
      'User-Agent: watilin',
      'Accept: application/vnd.github.v3.raw',
      'Authorization: token *****',
    ],
  ]
]);
 
$contents = file_get_contents($fileUrl, false, $context);
if (false === $contents) {
  die('Failed fetching the file :(');
}
 
if (false === file_put_contents($path, $contents, LOCK_EX)) {
  die('Failed storing the contents :(');
}
 
if (false === chmod($path, 0604)) {
  die('Failed chmodding :(');
};
 
echo 'Success :)';
Merci d’avance