timo-71

Рейтинг
63
Регистрация
19.09.2018
ArbNet #:
но в результате мне это только повредило.
Если это про это:
ArbNet #:
стало in_array('admin',(array)$_SESSION['access'])

Самый простой способ завести функцию из пары строк. Ну вот, на примере питона, где если нет ключа - фатал еррор терминами пхп. Но, у объекта дикт, в базе есть метод гет, который сделает все предсказуемым.

>>> a={'a':1}
>>> print(a['aa'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'aa'
>>> print(a.get('aa'))
None
>>> print(a.get('aa', {'default':1}))
{'default': 1}

Когда был на пыхе так и делал.
-= Serafim =- #:
А на обычном простом самописе будет в пару гигов, думаю.

А может и так:

290:xml×30000:posts×(60:title+60:h1+127:descr+15:categ+50:url+2000:ru_utf_content_x2)b ~ 20Gb

ArbNet #:
Там просто питон преподают и люди пишут на чём умеют

Т.е. не смогли найти людей, которые пишут на пхп?

Пхп незаменим только на шареде, и то наверно есть хостинги где можно питон юзать. Начиная с ВПС уже нет такой зависимости от пхп. Причем даже телодвижений для запуска сайта на aiohttp меньше. Только нгинкс поставить. Питон 3,6 на центос 8 в базе. В /etc/nginx/conf.d/site.conf

upstream aiohttp {
  server unix: /tmp/site_1.sock fail_timeout = 0;
}
..........
location / {
proxy_set_header Host $http_host; proxy_set_header X- Forwarded - For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_buffering off; proxy_pass http://aiohttp;
}

В консоли:

systemctl restart nginx

python3 /path/app.py --path=/tmp/site_1.sock

И все сайт работает

ArbNet #:
Он не лучшее решение для веб разработки, он просто стал популярен так как некоторые высоконагруженные проекты его используют

Противоречие наблюдается. Если питон плохое решение, то почему высоконагруженные его используют?

Имхо, может и не лучшее, но уж точно php не уступит.  Говорю, как тот, кто после почти 20 лет php+mysql, перепрыгнул на питон.

Ну вот ,  например:

<?php
header('Content-Type:text/plain');
die('Eeeee');

ab -n 3000 -c 500

Non-2xx responses:      1225

2020/11/26 13:37:01 [error] 36441#36441: *4943 connect() to unix:/var/run/php-fpm/www.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 127.0.0.1, server: ~^(.*?)\.?(?<d_name>[^\.]+)\.php$, request: "GET / HTTP/1.0", upstream: "fastcgi://unix:/var/run/php-fpm/www.sock:", host: "p.php"

------------------------

aiohttp(python39) + mongodb + dbsqlite + redis

Главная сайта-магазина


Non-2xx responses:      0

Сравнение, конечно не корректно, пхп только 5 байт выводит и все, при этом (при стандартных настройках) 500 одновременных запросов ему не по силам. Конечно, поиграв с pm, можно

Питон же полностью собирает главную страницу сайта и при этом нагрузку держит. 😎

Натройки при тесте:

пхп

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35


aiohttp: 4 процесса

upstream dodohttp {
  #supervisord cmd: /var/pyweb/env/bin/python /var/pyweb/env/pyc/app.py --path=/tmp/appc_%(process_num)s.sock  
  server unix:/tmp/appc_1.sock fail_timeout=0;
  server unix:/tmp/appc_2.sock fail_timeout=0;
  server unix:/tmp/appc_3.sock fail_timeout=0;
  server unix:/tmp/appc_4.sock fail_timeout=0;
}

Добавлю, шабнизатор забыл у питона, который тоже ресурсы потребляет

from jinja2 import Template
from jinja2 import Environment, FileSystemLoader
ArbNet #:
А я делаю для тех кто этого делать не может, но им нужно как-то реализовать, что им хочется чтобы было. Поэтому я использую XML чтобы человек не искал разные файлы, шаблоны скрипты, стили и тд. что-то в них правил, у меня всё намного проще, надо знать простые правила и указывать что и как хочется разместить на странице, всё остальное будет делать движок.

Чтобы указывать, надо что то знать. Так , что то же самое, только данные не в хмл. А сразу в базе.

ArbNet #:

То есть надо только в одном файле прописать то, что нужно и всё.

Врядли это есть хорошо. На одном документе может быть один набор компонент, а на другом другой. 

ArbNet :

С js ситуация следующая: движок подключает в head скрипт загрузчика и тот подключает нужные модули указанные в XML структуре.

В чём вопрос? Сейчас чтобы на странице работали js скрипты нужно указывать в структуре(XML) какие модули необходимы.

У меня, просто - для любого документа можно добавить свой  cssList и jsList. И никакого XML🤪

В шаблоне

{% if cssList %}
const cssList = {{ cssList }};
{% endif %}
{% if jsList %}
const jsList = {{ jsList }};
{% endif %}
В js
  if (typeof cssList !== 'undefined') {
    if(typeof cssList == 'string') cssList = cssList.split(',');
    else if(!Array.isArray(cssList)) cssList = null;
    if(cssList){  for( let i in cssList ) { addcss(cssList[i]); } };
  }

  if( document.querySelector(".fa") ) {
    addcss('/static/vendor/font-awesome-4/css/font-awesome.min.css');
  }

Кроме того,  на мой взгляд, д.б. предусмотрена динамическая загрузка. Ну, типа, что то поменялось, например пользователь залогинился или еще чего (XHR рулит), нужны какие то  доп. функции.

Или вот, нажал юзер кнопку иии.. загрузился редактор, навесился на элементы [data-cid], а кнопку повесил Listener активации и деактивации редактора.

let el = $$('adm_btn')
if(el){
      let elms = document.querySelectorAll('[data-cid]');
      if(elms.length) {
        loadScript( baseHost+'/static/vendor/*****/awysiwyg/dist/bundle.js', function(){
          let m = new aEditor.app(elms);
          el.addEventListener('click', (e)=>{
            if( m.is_disabled ){
              el.classList.add('active');
              m.editor_init();
            } else {
              el.classList.remove('active');
              m.editor_destroy();
            }
          });
        });
        addcss(baseHost + '/static/vendor/*****/awysiwyg/dist/css/ed.css');
      }
}

HelgaBorjoni #:
Эта функция подойдет.
function mb_unserialize($string) {
    $string = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $string);
    return unserialize($string);
}

С доработками для php 7+ в виде preg_replace_callback().

lutskboy :
если присмотреться то видим s:10:"Обсуждение";

Норм, для cp1251.

5 минут:

<?php

$o = 'a:9:{s:11:"description";s:10:"Обсуждение";s:15:"additional_data";s:0:"";s:16:"informationTitle";s:0:"";s:15:"informationText";s:0:"";s:9:"rulesText";s:0:"";s:8:"newTopic";b:0;s:9:"readTopic";b:0;s:11:"replicTopic";b:0;s:8:"viewTree";a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}}';
header('Content-Type:text/plain');
function _f(&$a){
    foreach($a as $k=>$v) {
        if(is_array($v)){
            $a[$k] = _f($v);
        } else {
            $a[$k] = is_string($v) ? $o = iconv ( 'cp1251' , 'utf-8' , $v ) : $v;
        }
    }
}
try {
    $o = iconv ( 'utf-8' , 'cp1251' , $o );
    $o =  unserialize($o);
    print_r($o);
    _f($o);
    print_r($o);

} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}


exit();

Результат:

Array
(
    [description] => ����������
    [additional_data] =>
    [informationTitle] =>
    [informationText] =>
    [rulesText] =>
    [newTopic] =>
    [readTopic] =>
    [replicTopic] =>
    [viewTree] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
        )

)
Array
(
    [description] => Обсуждение
    [additional_data] =>
    [informationTitle] =>
    [informationText] =>
    [rulesText] =>
    [newTopic] =>
    [readTopic] =>
    [replicTopic] =>
    [viewTree] =>
)

Но, надо заранее знать, что "серили" (а как еще это назвать, когда json)  в цп1251🤣

maximka77 #:

На официальном блоге Яндекса было так озвучено:

>>"Реклама, затрудняющая восприятие основного контента или мешающая навигации по сайту, негативно влияет на >>пользовательский опыт — пользователи быстрее покидают такие сайты."

Зачем вы ставите всякое гавно на сайт?

А зачем верить блогу сайта, который сам использует рекламу (директ), которая затрудняет (отодвигает вниз)  восприятие основного контента.

SeVlad #:
Графику нужно готовить на десктопе.

Не обязательно. 

switch( $this->type ) {
      case 'jpeg':
      case 'jpg':
        $cmd = 'jpegoptim ' . escapeshellarg($this->src) .' --strip-all --all-progressive -m 76';
      break;

      case 'png':
        $cmd = 'pngquant --strip --quality=65-85 --ext .png  --force 256 ' . escapeshellarg($this->src);
      break;
    }
Всего: 541