-
Type: Bug
-
Resolution: Fixed
-
Priority: Minor - P4
-
Affects Version/s: 1.1.0
-
Component/s: None
-
None
This came up during a code review for PHPLIB-233:
<?php require 'vendor/autoload.php'; $bucket = (new MongoDB\Client)->test->selectGridFSBucket(); $stream = $bucket->openUploadStream('filename');
The following produces the following error when run as a CLI script:
Warning: hash_final(): supplied resource is not a valid Hash Context resource in /home/jmikola/workspace/mongodb/phplib/src/GridFS/WritableStream.php on line 222 Fatal error: Uncaught Error: Class 'MongoDB\Operation\FindOne' not found in /home/jmikola/workspace/mongodb/phplib/src/Collection.php:594 Stack trace: #0 /home/jmikola/workspace/mongodb/phplib/src/GridFS/CollectionWrapper.php(333): MongoDB\Collection->findOne(Array, Array) #1 /home/jmikola/workspace/mongodb/phplib/src/GridFS/CollectionWrapper.php(317): MongoDB\GridFS\CollectionWrapper->isFilesCollectionEmpty() #2 /home/jmikola/workspace/mongodb/phplib/src/GridFS/CollectionWrapper.php(254): MongoDB\GridFS\CollectionWrapper->ensureIndexes() #3 /home/jmikola/workspace/mongodb/phplib/src/GridFS/WritableStream.php(229): MongoDB\GridFS\CollectionWrapper->insertFile(Array) #4 /home/jmikola/workspace/mongodb/phplib/src/GridFS/WritableStream.php(137): MongoDB\GridFS\WritableStream->fileCollectionInsert() #5 /home/jmikola/workspace/mongodb/phplib/src/GridFS/StreamWrapper.php(73): MongoDB\GridFS\WritableStream->close() #6 [internal function]: MongoDB\GridFS\StreamWrapper->stream_close() #7 {main} thrown in /home/jmikola/workspace/mongodb/phplib/src/Collection.php on line 594
Running this script through PHP 7.2 produces the following errors:
- The MD5 hash context has already been freed before we finalize it
- The MongoDB\Operation\FindOne class cannot be autoloaded at this point
On PHP 5.6, only the autoloading error appears (with a reference to spl_autoload() being unable to load the class).
I believe the commonality in both of these errors is that we're running logic after the request has ended. As the last reference to the $stream is removed, its close handler is invoked. We should investigate whether there is a workaround for this short of advising users to manually close any streams defined in a global context.
- related to
-
PHPLIB-1313 GridFS close writable stream when the process ends to ensure the file is sent
- Closed