Comments (11)
@codercms are you always experiencing that low performance or it depends on the text length? Does anything change if /maxmemory:NN
gets added to php://temp
? The filesystem should only be used when the text is big (default limit is 2Mb).
from laminas-diactoros.
my suggestion is to implement pure RAM string stream.
Overall agree, php://memory
could suffice here, but we also are not sure if the provided string|StreamInterface
will fit in memory, hence why a more conservative php://temp
was used here.
I suggest sending a patch, and then we discuss the implications there: it is also acceptable to tell end-users that TextResponse
is not intended for large payloads (which is in fact the original design anyway)
from laminas-diactoros.
@lcobucci there is two cases:
- I'm experiencing low performance because TextResponse doing excess allocation of PHP native stream (allocation time + string copying time)
- With large text length performance difference is even more
Patched TextReponse:
$size = 10 * 1024 * 1024;
$body = new Stream("php://temp/maxmemory:{$size}", 'wb+');
It is still slower than approach without PHP native stream allocation.
320 RPS without native PHP stream
260 RPS with native PHP stream
from laminas-diactoros.
@Ocramius I guess this patch will not affect end users, because php native stream is only allocated when string was passed to the constructor - this means that the memory for response is already allocated.
from laminas-diactoros.
Looking back at this, I think that for text, we can use php://memory
, and let consumers with large text/plain
payloads implement their own streamed response perhaps?
Unsure if this should be considered a BC break.
from laminas-diactoros.
Similar for html
, which is the more common response object.
from laminas-diactoros.
@Ocramius I think there is one more approach (in two different ways):
- Create a “fake” stream object that is just simulating stream behavior (under the hood its just a string wrapper which implements StreamInterface) - end user will have to create stream object
- Create a true plain string response which will create a “fake” stream object under the hood - no additional actions for end user
from laminas-diactoros.
I didn't really understand the difference between those suggested approaches 🤔
from laminas-diactoros.
@Ocramius actually its only one approach which can be implemented in two manners
from laminas-diactoros.
But basically, if I understand it correctly, avoiding usage of a stream at all, and having a string
variable instead (since html
/text
responses are generally well within the memory limits)
from laminas-diactoros.
@Ocramius yes it is. The performance problem occurs when the Response object allocates stream for string
(I mean PHP stream), but actually there is no need to allocate memory one more time.
from laminas-diactoros.
Related Issues (20)
- `FilterUsingXForwardedHeaders` should correctly deal with `<host>:<port>` pair in `X-FORWARDED-HOST` header HOT 9
- [RFC]: Allow better constraint handling for PHP HOT 2
- Could ServerRequestFactory::marshallUriFromSapi() be made public? HOT 4
- Update to PSR-7 1.1/2.0 HOT 2
- Remove image stream compatibility from `Stream`
- CVE-2023-29530: Fix For PHP 7.4 HOT 16
- CLI command to register diactoros as pinned for `php-http/discovery`
- Drop deprecated function marshalUriFromSapi
- PhpInputStream::getContent() inconsistency HOT 9
- RFC: Read php input stream content into php temp stream to allow all stream features in PhpInputStream HOT 1
- Numeric header names handling in PSR-7 message objects
- V3 getBody()->getContents() no longer returns full stream on second call HOT 3
- `composer.json` provides non-existing versions of `psr/http-factory`
- security vonerability HOT 1
- Plus signs in cookie data get converted to space.
- marshal_headers_from_sapi.php line 29 HOT 2
- `Uri::__toString()` can yield malformed URIs HOT 2
- 2.x series does not support PHP 8.3 HOT 20
- [RFC]: Remove `scheme` filtering HOT 3
- Malformed request causes 500 response HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from laminas-diactoros.