xref: /PHP-7.2/ext/phar/tests/tar/refcount1.phpt (revision 9c5af4e4)
1--TEST--
2Phar: test that refcounting avoids problems with deleting a file tar-based
3--SKIPIF--
4<?php if (!extension_loaded("phar")) die("skip"); ?>
5<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
6--INI--
7phar.readonly=0
8phar.require_hash=0
9--FILE--
10<?php
11include dirname(__FILE__) . '/files/tarmaker.php.inc';
12$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.tar';
13$alias = 'phar://' . $fname;
14
15$tar = new tarmaker($fname, 'none');
16$tar->init();
17$tar->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
18
19$files = array();
20
21$files['a.php'] = '<?php echo "This is a\n"; ?>';
22$files['b.php'] = '<?php echo "This is b\n"; ?>';
23$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
24$files['.phar/alias.txt'] = 'hio';
25
26foreach ($files as $n => $file) {
27	$tar->addFile($n, $file);
28}
29
30$tar->close();
31
32$fp = fopen($alias . '/b/c.php', 'wb');
33fwrite($fp, "extra");
34fclose($fp);
35echo "===CLOSE===\n";
36$phar = new Phar($fname);
37$b = fopen($alias . '/b/c.php', 'rb');
38$a = $phar['b/c.php'];
39var_dump($a);
40var_dump(fread($b, 20));
41rewind($b);
42echo "===UNLINK===\n";
43unlink($alias . '/b/c.php');
44var_dump($a);
45var_dump(fread($b, 20));
46include $alias . '/b/c.php';
47
48?>
49
50===DONE===
51--CLEAN--
52<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.tar'); ?>
53--EXPECTF--
54===CLOSE===
55object(PharFileInfo)#%d (2) {
56  [%spathName":%sSplFileInfo":private]=>
57  string(%d) "phar://%srefcount1.phar.tar/b/c.php"
58  [%sfileName":%sSplFileInfo":private]=>
59  string(%d) "c.php"
60}
61string(5) "extra"
62===UNLINK===
63
64Warning: unlink(): phar error: "b/c.php" in phar "%srefcount1.phar.tar", has open file pointers, cannot unlink in %srefcount1.php on line %d
65object(PharFileInfo)#%d (2) {
66  [%spathName":%sSplFileInfo":private]=>
67  string(%d) "phar://%srefcount1.phar.tar/b/c.php"
68  [%sfileName":%sSplFileInfo":private]=>
69  string(%s) "c.php"
70}
71string(5) "extra"
72extra
73===DONE===
74